You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MassTransit使用IRequestClient如何设置Headers并支持多响应类型

解决方案

方案1(最优):使用IRequestClient.GetResponse原生带回调的重载

MassTransit 原生为多响应类型的GetResponse提供了支持配置SendContext的重载,无需改用RequestHandle,直接传入Header配置逻辑即可同时满足两个需求:

IRequestClient<T1> client = bus.CreateRequestClient<T1>(remoteUri, requestTimeout);
var response = await client.GetResponse<T2, AuthorizationErrorResponse>(data, 
    callback: sendContext => 
    {
        sendContext.Headers.Set(HeadersConst.AccessTokenKey, enveloppe.AccessToken);
    }).ConfigureAwait(false);

后续可以正常通过response.Is<T2>()、response.Is<AuthorizationErrorResponse>()判断返回的响应类型,原有业务逻辑无需调整。

方案2(备选,适配RequestHandle场景):手动监听多响应任务

如果确实需要使用RequestHandle做更精细的请求生命周期控制,可以通过分别监听多个响应任务的方式实现多类型支持:

IRequestClient<T1> client = bus.CreateRequestClient<T1>(remoteUri, requestTimeout);
Response<T2, AuthorizationErrorResponse> response = default;
using (RequestHandle<T1> requestHandle = client.Create(data, cancellationToken))
{
    requestHandle.UseExecute(o =>
    {
        o.Headers.Set(HeadersConst.AccessTokenKey, enveloppe.AccessToken);
    });

    // 分别创建两类响应的监听任务
    var successResponseTask = requestHandle.GetResponse<T2>();
    var authFailResponseTask = requestHandle.GetResponse<AuthorizationErrorResponse>();

    // 等待第一个返回的响应
    var completedTask = await Task.WhenAny(successResponseTask, authFailResponseTask).ConfigureAwait(false);
    
    // 构造多响应结果
    response = completedTask == successResponseTask 
        ? new Response<T2, AuthorizationErrorResponse>(await successResponseTask) 
        : new Response<T2, AuthorizationErrorResponse>(await authFailResponseTask);
}

内容的提问来源于stack exchange,提问作者Cem.S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:06:03