0

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

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

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 服务。

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

现在,当用户提出请求时,我使用的是请求-响应模式(尽管我认为这并不重要)

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

问题是,当执行此代码时,Masstransit 尝试将标头添加到消息中,OperationContext.Current显然null它运行在与用户调用不同的线程上。

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

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

我知道我可以在发布消息时添加标头,但我希望所有源自 Web 应用程序的消息都具有此标头,并希望在全球范围内设置它。

4

1 回答 1

1

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

于 2017-10-27T20:52:06.933 回答