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
相关产品推荐
相关产品推荐

