【问题标题】:Read headers of response in MassTransit Response-Request读取 MassTransit Response-Request 中的响应标头
【发布时间】:2018-12-12 05:24:18
【问题描述】:

我正在使用带有 Rabbit MQ 的 MassTransit v.5*,并且我正在执行正常的请求响应,如 http://masstransit-project.com/MassTransit/usage/request-response.html

我在消费者的响应消息上设置标题

await context.RespondAsync<OrderStatusResult>(
        new 
        {
            OrderId = order.Id,
            Timestamp = order.Timestamp,
            StatusCode = order.StatusCode,
            StatusText = order.StatusText
        }
    , callback => callback.Headers.Set("key", "value"))

我看到这个标头是通过查看 RabbitMQ 设置的,但是在调用者端我无法访问这些标头。

那么,如何在调用方访问响应消息的标头?

谢谢!

【问题讨论】:

    标签: c# rabbitmq masstransit


    【解决方案1】:

    使用新的请求客户端,而不是原来的客户端,您可以通过响应访问消息上下文。

    var client = Bus.CreateRequestClient<GetOrderStatus>(ServiceAddress);
    
    var request = new GetOrderStatus(...);
    var response = await client.GetResponse<OrderStatusResult>(request);
    // response is type Response<OrderStatusResult>
    
    var headerValue = response.Headers.Get...("key")
    

    【讨论】:

    • 对于旧的,我可以做类似var client = _busControl.CreateRequestClient&lt;TRequest, TResponse&gt;( exchangeAddress, timeout, timeToLive, context =&gt; { context.Durable = false; context.Headers // add header here! }); 的事情,这对我来说非常有价值。但是对于新的,我只能设置超时。所以生存时间和访问 SendContext 不再可用。这是故意的吗?
    • 如果您使用 client.Create(request) 并使用 RequestHandle 设置这些内容,则可以在上下文中设置任何内容,然后在请求句柄上调用 GetResponse。此外,您可以在创建请求客户端时指定默认 TTL,这样您就不必在每次调用时都指定它。
    • 您可以在客户端的单元测试中看到如何:github.com/MassTransit/MassTransit/blob/develop/src/…
    • 这正是我需要的。 using (var requestHandle = client.Create(request)) { ...} 第一次调用它时运行良好,但总是在第二次调用时我得到一个讨厌的“[InvalidOperationException:异步模块或处理程序已完成,而异步操作仍处于挂起状态。]”要提一下,我的方法被调用不是异步等待,因为我在一个遗留项目中工作。仍然必须深入研究它,也许我可以对它做一个适当的 jon。感谢您的所有帮助,这很棒,令人大开眼界。任何额外的小费都是不错的奖励。
    • 代码:``` private TResponse RpcCall(TRequest request, TimeSpan timeout, TimeSpan timeToLive) where TRequest : class where TResponse : class { var exchangeAddress = GetDestinationExchangeAddress() ; var client = _busControl.CreateRequestClient(exchangeAddress, timeout); TResponse 响应 = Activator.CreateInstance();使用 (var requestHandle = client.Create(request)) { } 返回响应; }```
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 2017-04-02
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2020-05-26
    • 2021-09-28
    相关资源
    最近更新 更多