C# 在WCF中,操作是否总是在与消息检查器相同的线程上调用?
我有一个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的构造函数
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 );
}