【发布时间】:2021-11-26 11:43:49
【问题描述】:
我在管道中添加了一个授权过滤器,用于检查用户的令牌是否有效。
到目前为止,发送Request时,令牌已添加到SendContext的Headers中:
var response = await bus.Request<T1, T2>(remoteUri, data, timeout: requestTimeout,
callback: o =>
{
o.Headers.Set(HeadersConst.AccessTokenKey, enveloppe.AccessToken);
});
检查令牌后,如果发生未经授权的访问,我的过滤器会抛出异常。这种行为会产生一个错误,调用者的请求超时结束。
现在我想更进一步,返回带有未经授权访问的特殊类型的响应:
// In my filter when the token is invalid
await context.RespondAsync(new AuthorizationErrorResponse
{
Error = error,
Message = message
});
因此,我修改了调用者的代码:
IRequestClient<T1> client = bus.CreateRequestClient<T1>(remoteUri, requestTimeout);
var response = await client.GetResponse<T2, AuthorizationErrorResponse>(data).ConfigureAwait(false);
现在这就是我卡住的地方。我也想设置Headers,但在使用IRequestClient 对象时似乎不能。这也是我首先使用扩展方法Request<T1, T2> 的原因。如果我尝试修改代码并改用RequestHandle,我可以设置我的标头,但我会失去多响应类型功能:
IRequestClient<T1> client = bus.CreateRequestClient<T1>(remoteUri, requestTimeout);
Response<T2, AuthorizationErrorResponse> response = default;
using (RequestHandle<T1> requestHandle = client.Create(data, token))
{
requestHandle.UseExecute(o =>
{
o.Headers.Set(HeadersConst.AccessTokenKey, enveloppe.AccessToken);
});
// This call isn't supported by RequestHandle
response = await requestHandle.GetResponse<T2, AuthorizationErrorResponse>(data).ConfigureAwait(false);
}
是否有任何解决方法可以实现我想要做的事情?
感谢您的帮助
【问题讨论】:
标签: c# request masstransit