我正在尝试向包含来自 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 应用程序的消息都具有此标头,并希望在全球范围内设置它。