1

WCFサービスがあり、次の(簡略化された)クラスがあります。

public class PerOperationSingleton : IDisposable
{
    private static bool _hasInstance = false;

    public PerOperationSingleton()
    {
        if(_hasInstance)
            throw new InvalidOperationException("Cannot have multiple instances during a single WCF operation");

        _hasInstance = true;
    }

    public void Dispose()
    {
        _hasInstance = false;
    }
}

おそらく、それはかなり自明のコードです。WCFサービス全体にシングルトンは必要ありませんが、1回の操作呼び出し中にのみ必要です。PerOperationSingletonの1つのインスタンスが破棄された場合、同じWCF操作中に新しいインスタンスを作成しても安全です。

問題は、_hasInstance変数を1つのWCF操作に対してのみ有効にする方法がわからないことです。[ThreadStatic]については知っていますが、ASP.NETとWCFは、操作が単一のスレッドで実行されることを保証するものではなく、別のスレッドに転送される可能性があると聞いています。

_hasInstance = trueがスレッドプールに移動して、他の操作がプールからそのスレッドを選択した場合に誤って検出されることは絶対に避けたいです。

WCF操作が別のスレッドに移動する場合、_hasInstance変数が設定されていれば、「true」値を保持するようにします。

また、パフォーマンスに影響を与えたり、後でデバッグして解決するのが難しい問題が発生したりすることを避けるために、WCFサービスのグローバル設定を変更したくありません(高度なASP.NETおよびWCFトピックに十分に精通しているとは感じません) )。

クライアントがさまざまな理由で.NETセッションを無効にするように要求したため、セッションに_hasInstanceを保存することもできません。

PerOperationSingletonクラスを実際に環境に依存しないようにしたいと思います。WCFやASP.NETについては何も知らないはずです。

WCF操作の呼び出し全体で_hasInstance変数を静的にし、他のWCF操作に影響を与えないようにするにはどうすればよいですか?

4

1 に答える 1

2

OperationContextを使用して、操作呼び出し中にデータを「静的」にすることを検討します。

これは同様の議論です現在のWCF呼び出しのデータをどこに保存しますか?ThreadStaticは安全ですか?

于 2013-01-26T12:51:18.930 に答える