【问题标题】:MassTransit : Multiple Response Types and HeadersMassTransit:多种响应类型和标题
【发布时间】:2021-11-26 11:43:49
【问题描述】:

我在管道中添加了一个授权过滤器,用于检查用户的令牌是否有效。

到目前为止,发送Request时,令牌已添加到SendContextHeaders中:

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&lt;T1, T2&gt; 的原因。如果我尝试修改代码并改用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


    【解决方案1】:

    您可以look at the source 并创建自己的方法,或者您可以等待 7.2.3,它允许您配置请求,类似于使用句柄的方式。

    你可以看到GetResponse&lt;T&gt;被多次调用,Task.WhenAny

    【讨论】:

    • 非常感谢。 7.2.3 版本会很快发布吗?
    • 目前在预发布包中可用。
    【解决方案2】:

    在等待 MassTransit 的下一个版本时,这是解决我的问题的当前解决方案:

    /// <summary>
    /// Send a request and wait for multiple response types
    /// </summary>
    /// <typeparam name="TRequest">Request type</typeparam>
    /// <typeparam name="T1">First type of response expected</typeparam>
    /// <typeparam name="T2">Second type of response expected</typeparam>
    /// <param name="bus">MassTransit bus</param>
    /// <param name="request">Request to be sent</param>
    /// <param name="endpointUri">Endpoint Uri</param>
    /// <param name="timeout">Communication tineout</param>
    /// <param name="callback">Context setting callback</param>
    /// <param name="token">Cancellation token</param>
    /// <returns>One of the expected response types or timeout exception</returns>
    public static async Task<Response<T1, T2>> GetResponse<TRequest, T1, T2>(this IBus bus,
                                                                            TRequest request,
                                                                            Uri endpointUri,
                                                                            RequestTimeout timeout = default,
                                                                            Action<SendContext<TRequest>> callback = null,
                                                                            CancellationToken token = default)
        where TRequest : class
        where T1 : class
        where T2 : class
    {
        IRequestClient<TRequest> client = bus.CreateRequestClient<TRequest>(endpointUri, timeout);
        using RequestHandle<TRequest> handle = client.Create(request, token);
    
        if (callback != null)
        {
            handle.UseExecute(callback);
        }
    
        Task<Response<T1>> result1 = handle.GetResponse<T1>(false);
        Task<Response<T2>> result2 = handle.GetResponse<T2>();
    
        var task = await Task.WhenAny(result1, result2)
            .ConfigureAwait(false);
    
        await task.ConfigureAwait(false);
    
        return new Response<T1, T2>(result1, result2);
    }
    

    一旦下一个版本出现更简洁的解决方案,我将更新答案。

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 1970-01-01
      • 2019-06-10
      • 2020-04-06
      • 2011-07-08
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 2017-09-11
      相关资源
      最近更新 更多