C# Can´;是否从OperationContext向MassTransit消息添加标头?
我正在尝试向Masstransit邮件添加一个标题,其中包含来自WCF Web应用程序上当前登录用户的信息 因此,在我的web应用程序中,当应用程序启动时,我有以下内容:C# Can´;是否从OperationContext向MassTransit消息添加标头?,c#,wcf,masstransit,nettcpbinding,operationcontext,C#,Wcf,Masstransit,Nettcpbinding,Operationcontext,我正在尝试向Masstransit邮件添加一个标题,其中包含来自WCF Web应用程序上当前登录用户的信息 因此,在我的web应用程序中,当应用程序启动时,我有以下内容: IBusControl bus = Bus.Factory.CreateUsingRabbitMq(cfg => { cfg.Host(new Uri("rabbitmq://localhost/test"), r => { //... }); cfg.Config
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)));
});
问题是,当执行此代码时,Masstransit尝试将标头添加到消息中,OperationContext.Current
为null
,因为它显然是在不同的线程上运行的,而不是用户调用
奇怪的是,Masstransit最终开始从正确的线程调用UseSendExecute
,一切都开始工作。我必须重新启动IIS才能再次复制错误(!?)
有人有过这个问题吗?谢谢
我知道我可以在发布消息时添加标题,但我希望所有来自web应用程序的消息都具有此标题,并希望在全局范围内设置此标题。此问题看起来相关。我将使用相同的解决方法,并且我将使用IBusControl的包装器。为什么不在发送请求时设置头,在上下文中,这样就可以使用局部变量进行闭包?@AlexeyZimarev,thx,我想我可以在调用
CreateRequestClient
时设置头,但是每次打电话我都得这么做。我想在端点过滤器上处理用户信息(例如访问权限)@AlexeyZimarev这就是你要做的吗?此外,我还有其他关于\u bus.Publish
、路由单等的用例。我必须对每一个都这样做。我认为这个问题更具意识形态性,这不是关于线程,而是关于在发送消息时处于web请求上下文中。如果您使用IoC容器,您可能会从中获得一些上下文信息,因为通常您已经为每个请求封装了上下文。
var requestClient = _bus.CreateRequestClient<AddTicketRequest, AddTicketResponse>(uri, timeout);
var response = requestClient.Request(requestMessage);