0

複数のクライアントに接続する WCF サービスがあります。サービスは次のように構成されます。

ServiceBehavior(
        InstanceContextMode = InstanceContextMode.Single,
        UseSynchronizationContext = false,
        ...

私が使用するサービスでは、OperationContext.Current.SessionId を使用してクライアントを識別します。

public void Register()
{
        Debug.WriteLine(OperationContext.Current.SessionId);
}

次のシナリオを想像してください: - Client1 が Register を呼び出します - サービスが Thread1 で Register を実行します - 一定時間後に Client2 が Register を呼び出します - サービスが Thread1 でも Register を実行します (これは理論的には可能ですよね?)

OperationContext.Current が ThreadStatic であることを知っていると、2 番目の呼び出しが表示されます。

  • セッション 1 は、OperationContext.Current が最初の呼び出しで既に設定されているためです。
  • またはセッション 2 ..?

前もって感謝します ...

4

1 に答える 1

0

Session2 を取得します。セッションとインスタンス化は、WCF では 2 つの異なるものです。WCF セッションとインスタンス化の概念を理解するのに役立つ次の 2 つのブログ エントリを読むことをお勧めします。

http://www.dotnetconsult.co.uk/weblog2/PermaLink,guid,af6e6325-2e30-42e3-acb9-57e1363fa51e.aspx

http://www.dotnetconsult.co.uk/weblog2/PermaLink,guid,1efac821-2b89-47bb-9d27-48f0d6347914.aspx

これをクライアントでテストすることもできます。sessionID を返すように WCF メソッドを変更し、それをクライアントで使用しました。

static void Main(string[] args)
{
      ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
      Console.WriteLine(client.Regster());
      Console.ReadLine();
      client.Close();
}
于 2013-01-08T20:33:10.240 に答える