我想知道在WCF服务主机实例的实例变量中存储和引用OperationContext.Current对象是否明智。服务主机设置为InstanceContextMode.PerCall,因此每个新请求都有自己的实例。
我问这个的原因是因为WCF不保证线程亲和性。有时,WCF可以在一个线程上启动请求,并在另一个线程上结束请求。
OperationContext.Current对象存储在线程本地存储中。当一个新线程用于相同的操作时,WCF“传播”到新线程。
在这种情况下,当WCF开始使用不同的线程时,是否仍然可以安全地访问存储在我的服务实例的实例变量中的OperationContext对象?
答案 0 :(得分:2)
不是存储OperationContext
,而是将其包装在可以替换的抽象中,确保您需要的上下文所呈现的设施在抽象上 - 类似这样
interface IContextService
{
Message RequestMessage{ get;}
string SessionId{ get;}
}
然后有一个使用真实OperationContext
的实现class ContextService : IContextService
{
public Message RequestMessage
{
get
{
return OperationContext.Current.RequestContext.RequestMessage;
}
}
public string SessionId
{
get
{
return OperationContext.Current.SessionId;
}
}
}
如果您在课程中注入IContextService
,现在可以通过提供虚假版本进行测试