5

問題は、クラス内の静的データに関するものです。

それがサービスクラスの場合、インスタンス化モードが重要だと思います。しかし、別のスタンドアロンシングルトンクラスがある場合はどうなりますか?

通話ごとのすべての通話に使用できるオブジェクトをそこに作成できますか?シングルトンが常にメモリに存在するように、IISはそのdllをメモリに永久に保持しますか?

すべてのWCFクライアント呼び出しで使用できるオブジェクトを作成するにはどうすればよいですか?IISでそれを行うことは可能ですか、それともWindowsサービスでWCFサービスをホストする必要がありますか?

4

2 に答える 2

2

あなたが提供した短い文脈に基づいていくつかのヒントを提供します

  • 静的クラスがある場合、同じWCFプロキシにアクセスできる限り、状態は維持されます。ホスト(IISまたはWindowsサービス)は関係ありません。

  • クライアントリクエスト間で「グローバル静的変数」を維持したい場合は、それらをリポジトリ(ファイル/データベースなど)に保存してみませんか?

  • 各クライアント要求の状態を保持する場合は、「耐久性のあるWCFサービス」を試してみてください(関連するスレッド)。以前に使用したことがあるので、シナリオがセッションのような動作を要求し、パフォーマンスコストを認識していれば、機能します。

お役に立てれば。

于 2012-06-13T17:17:51.013 に答える
2

ローカルIISで問題を確認しました。

これは私のコードです。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService
{

    public static int _counter = 0;

    public string GetData()
    {
        _counter++;
        return _counter.ToString();
    }
}

デフォルトのIIS構成では、アプリケーションプルごとに1つのプロセスが実行され、このコードは期待どおりに機能します。結果は、サービス呼び出しごとに増分されます。

InstanceContextModeスレッドを管理しないため、これは理にかなっています。それは生涯の生涯を制御するだけInstanceContextです。

可変データに静的変数を使用することをベストプラクティスとして検討することはまだできないことを知っています。IISは「WebGarden」として構成できます。この構成は、アプリケーションプールごとに複数の作業プロセスが許可され、すべてのプロセスが静的変数の独自のコピーを持つことを意味します。

http://www.iis.net/ConfigReference/system.applicationHost/applicationPools

すべてのWCFクライアント呼び出しで使用できるオブジェクトを作成するにはどうすればよいですか?IISでそれを行うことは可能ですか、それともWindowsサービスでWCFサービスをホストする必要がありますか?

オブジェクトは、データベースや分散キャッシュなどの永続ストレージに保存する必要があります。IISは依然としてサービスの優れたホストであり、Windowsサービスで実行できるすべての機能に加えてさらに多くの機能を提供します。

于 2012-06-13T18:14:24.507 に答える