Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# 在WCF中,操作是否总是在与消息检查器相同的线程上调用?_C#_.net_Multithreading_Wcf - Fatal编程技术网

C# 在WCF中,操作是否总是在与消息检查器相同的线程上调用?

C# 在WCF中,操作是否总是在与消息检查器相同的线程上调用?,c#,.net,multithreading,wcf,C#,.net,Multithreading,Wcf,我有一个WCF线程问题,我还没有找到一个好的答案。我有一个IDispatchMessageInspector的实现,它具有以下AfterReceiveRequest实现: public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) { return new SessionScope(); } SessionScope的构造函数

我有一个WCF线程问题,我还没有找到一个好的答案。我有一个
IDispatchMessageInspector
的实现,它具有以下
AfterReceiveRequest
实现:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
   return new SessionScope();
}
SessionScope
的构造函数将当前作用域注册到一个字典中,该字典基本上通过线程跟踪它。然后我有以下操作:

[MyServiceBehavior]
public class Service1 : IService1
{
   public string GetData(int value)
   {
      // Uses SessionScope.Current object for various things
   }
}

GetData
是否保证与先前检查WCF消息的消息检查器在同一线程上运行?同样,SendReply之前的
是否也会在同一个线程上运行?

假设您在IIS下运行,答案是否

IIS有一个叫做“线程敏捷性”的东西,这意味着单个请求可以跳转线程。我们在这方面有几个问题,在一个案例中,我们通过使用http上下文解决了这个问题


看看这个问题的答案:

您不能保证请求将保持在同一个线程上。IIS可以(并且将)在线程之间传递它

要实现目标,可以将对象加载到OperationContext.Current(如果启用了aspCompatibilityMode,则加载到HttpContext.Current)。我通过向OperationContext.Extensions列表中添加对象完成了此操作:

首先,您的类必须实现IExtension

public sealed class SessionScope : IExtension<OperationContext> {
  // your class details here
}
之后,无论线程切换如何,它都将在任何地方对您可用

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
   SessionScope scope = new SessionScope();
   OperationContext.Current.Extensions.Add( scope );
}