【问题标题】:In WCF, will the operation always be invoked on the same thread as the message inspector?在 WCF 中,操作是否总是在与消息检查器相同的线程上调用?
【发布时间】:2012-12-04 18:31:13
【问题描述】:

我有一个 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 消息的消息检查器在同一线程上运行?同样,BeforeSendReply 也会在同一个线程上运行吗?

【问题讨论】:

    标签: c# .net multithreading wcf


    【解决方案1】:

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

    要实现您的目标,您可以将对象加载到 OperationContext.Current(或 HttpContext.Current,如果您打开了 aspCompatibilityMode)。我通过将对象添加到 OperationContext.Extensions 列表来完成它:

    首先,你的类必须实现 IExtension

    public sealed class SessionScope : IExtension<OperationContext> {
      // your class details here
    }
    

    然后您需要将您的对象添加到 OperationContext:

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

    之后,无论线程切换如何,您都可以使用它。

    【讨论】:

      【解决方案2】:

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

      IIS有个东西叫“线程敏捷”,意思是单个请求可以跳转线程。我们有几个问题,在一种情况下,我们通过使用 http 上下文解决了这个问题。

      看看这个问题的答案:Will a request in IIS run on a single thread?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多