无法从OperationContext向MassTransit消息添加标头?

时间:2017-08-29 17:44:42

标签: c# wcf masstransit nettcpbinding operationcontext

我正在尝试向Masstransit消息添加标头,其中包含来自WCF Web应用程序上当前登录用户的信息。

所以在我的网络应用程序中,我在应用程序启动时有以下内容:

IBusControl bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    cfg.Host(new Uri("rabbitmq://localhost/test"), r =>
    {
        //...
    });

    cfg.ConfigureSend(
        s => s.UseSendExecute(
            c => c.Headers.Set(Constants.UserInfo, 
           OperationContext.Current.Channel.Extensions.Find<PropertyUserInfo>().Info)));
});
  

我正在使用IoC容器在应用程序(单例范围)中只创建一次IBusControl,然后将IBusControl注入到Web服务中。

     

请注意,当我创建servicebus时,OperationContext.Current不存在,我希望在请求上下文中调用lambda c= > c.Headers.Set(...)

现在,当用户发出请求时,我正在使用请求 - 响应模式(虽然我不认为这很重要)

var requestClient = _bus.CreateRequestClient<AddTicketRequest, AddTicketResponse>(uri, timeout);
var response = requestClient.Request(requestMessage);

问题是,当执行此代码并且Masstransit尝试将标头添加到消息时,OperationContext.Currentnull,因为它显然是在不同的线程上运行,然后用户调用。 / p>

奇怪的是,最终Masstransit开始从正确的线程中调用UseSendExecute,一切都开始起作用了。我必须重新启动IIS以再次复制该错误(!?)。

有没有人遇到过这个问题?感谢。

我知道我可以在发布消息时添加Header,但我想让所有来自Web应用程序的消息都有这个标题,并希望它能在全局设置。

1 个答案:

答案 0 :(得分:1)

问题https://github.com/MassTransit/MassTransit/issues/921看起来很相关。我将使用相同的解决方法,我将使用IBusControl的包装器。