Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can´;是否从OperationContext向MassTransit消息添加标头?_C#_Wcf_Masstransit_Nettcpbinding_Operationcontext - Fatal编程技术网

C# Can´;是否从OperationContext向MassTransit消息添加标头?

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

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

因此,在我的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)));
});
问题是,当执行此代码时,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);