7

OperationContext.Current.GetCallbackChannel は実際に何をしますか? 個々のクライアントをどのように識別しますか?

WCF サービスで問題に直面しています。2 人以上のユーザーがサービスに接続した場合、サービスからクライアントに送信しているすべての「興味深い変更」は、2 番目に参加したユーザーに送信されます。

たとえば、A、B、C、D がサービスに参加した場合、コールバックを介して C と D に変更を送信すると、B に送信されます。

何か案は?

詳細

クライアント: ASP.NET Web アプリ

バインディング: netTCPBinding

アップデート1

OKIE、問題の原因を発見しました。IIS で asp.net クライアントをホストしました。たとえば、クライアントの URL はhttp://url1です。ページの複数のインスタンスを別のマシンで開いてサービスに参加すると、コールバック チャネルは常にページの最初のインスタンスを指しています (別のマシンからサイトを開きます)。しかし、IIS の異なるサイトで asp.net クライアントをホストすると、コールバック チャネルは一意になります。それについて何か考えはありますか?

4

2 に答える 2

6

サービスが呼び出しを受信すると、OperationContext.Current.GetCallbackChannelはその呼び出し元だけにチャネルを返します。すべてのクライアントにブロードキャストするチャネルは返されません。

あなたの質問から、最後の呼び出しで取得されたコールバックのみを保存している可能性があります。実際には、取得された一意のコールバックインスタンスをそれぞれ含むリストを保存する必要があります。メソッドが呼び出されるたびに、このリストにコールバックインスタンスを追加します。ブロードキャストする場合は、リスト内の各項目を繰り返し処理して、必要な呼び出しを行う必要があります。

サービスがシングルトンインスタンスモードを使用している場合、実装オブジェクトはコールバックインスタンスのリストをデータメンバーとして保存できます。サービスがクライアントまたはシングルコールインスタンスモードを使用している場合は、コールバックインスタンスのリストを含むグローバルオブジェクトを作成できます。

于 2010-07-05T04:12:57.363 に答える
1

セッションごとに個別のスレッドを作成するようにサービスを構成する必要があります。http://msdn.microsoft.com/en-us/library/cc681240.aspxをご覧ください。

于 2010-07-03T12:01:14.477 に答える