3

OperationContext.Current オブジェクトを WCF サービス ホスト インスタンスのインスタンス変数に格納して参照することが賢明かどうかを知りたいと思いました。サービス ホストは InstanceContextMode.PerCall に設定されているため、すべての新しいリクエストは独自のインスタンスを取得します。

これを尋ねる理由は、WCF がスレッド アフィニティを保証しないためです。場合によっては、WCF が 1 つのスレッドで要求を開始し、別のスレッドで要求を終了することがあります。

OperationContext.Current オブジェクトは Thread Local Storage に格納されます。同じ操作に新しいスレッドが使用されると、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 に答える