将OperationContext.Current存储在WCF服务实例的实例变量中

时间:2012-05-13 00:08:39

标签: wcf web-services thread-local-storage operationcontext

我想知道在WCF服务主机实例的实例变量中存储和引用OperationContext.Current对象是否明智。服务主机设置为InstanceContextMode.PerCall,因此每个新请求都有自己的实例。

我问这个的原因是因为WCF不保证线程亲和性。有时,WCF可以在一个线程上启动请求,并在另一个线程上结束请求。

OperationContext.Current对象存储在线程本地存储中。当一个新线程用于相同的操作时,WCF“传播”到新线程。

在这种情况下,当WCF开始使用不同的线程时,是否仍然可以安全地访问存储在我的服务实例的实例变量中的OperationContext对象?

1 个答案:

答案 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,现在可以通过提供虚假版本进行测试