8

セッションが必要な WCF サービスがあります

   [ServiceContract(SessionMode = SessionMode.Required) ]

およびいくつかの静的フィールド。セッションを持つことで、静的フィールドは各セッションで同じままですが、セッションごとに新しいインスタンスが作成されると考えました。ただし、2 つの異なるクライアントにサービスを使用させると、一方のクライアントがフィールドの値を変更すると、この変更がもう一方のクライアントにも影響することがわかります。これは、異なるセッションを持つ場合の通常の動作ですか? それとも、私のサービスが別のセッションを作成していない可能性があると思いますか?

私はnetTCPbindingを使用しています。

4

3 に答える 3

10

静的変数はプロセス全体で共有されるため、表示される動作になります。ただし、サービスのインスタンス コンテキスト モードを per-sessionに設定すると、そのサービス インスタンスは、その (非静的) 変数とともに、セッションごとに作成されます。したがって、ここsomevarにセッションに固有のものがあります。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class Service : IService
{
    private string sessionVariable;         // separate for each session

    private static string globalVariable;   // shared across all sessions
}
于 2013-07-25T19:56:12.763 に答える
4

static フィールドは、アプリケーションの存続期間中グローバルです。したがって、異なるクライアントは同じ静的変数を認識します。クライアントごとに「静的変数」が必要な場合は、そのユーザーのセッション状態のどこかに保存する必要があります(WCFをよく知らないので、WCFのコンテキストでそれが正確に何を意味するのかわかりません)

于 2013-07-25T19:55:40.490 に答える
3

静的変数のスコープはアプリケーション ドメインです。これは、実際のタイプ (インスタンスが作成されるクラス) がアプリケーション ドメインに一度読み込まれ、それに関連付けられているすべての静的変数とメソッドが読み込まれるためです。したがって、サービスの複数のインスタンスまたは単一のインスタンスがある場合でも、それらは静的変数を共有します。

于 2013-07-26T03:48:18.807 に答える