3

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

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

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

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

4

1 回答 1

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到你的类中,你现在可以通过提供一个假版本来进行测试

于 2012-05-13T23:41:37.250 回答