2

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

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
   return new SessionScope();
}

for 的构造函数SessionScope将当前范围注册到一个字典,该字典基本上通过其线程跟踪它。然后我有以下操作:

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

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

4

2 回答 2

4

您不能保证请求将保留在同一个线程上。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 );
}

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

于 2012-12-04T22:15:34.627 回答
3

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

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

看看这个问题的答案:IIS 中的请求会在单个线程上运行吗?

于 2012-12-04T22:05:12.310 回答