2

Ajax-Wcf サービスを有効にして、Asp.Net チャットを開発しています。これは非常にシンプルなチャット エンジンで、メッセージ ダイアログは 1 対 1 (1 人のユーザー) を意味しますが、新しいメッセージの可用性を (最善の方法で) 通知する方法がわかりません。たとえば、次のシナリオを想定します。

ユーザーから別のユーザーに新しいメッセージを送信する必要があるときは常に、次のような JavaScript コードを記述します。

// btnSend client event handler
MyWcfNamespace.MyWcfClass instance = new ..();
instance.CallMethod("message string", callBackFunction, null);

とても簡単です。ここで、反対側 (私のメッセージを受信するユーザー) から、新しいメッセージがいつ送信されたかを知るために何らかのメカニズムが必要です。ajaxタイマーを使用して、利用可能な場合は文字列メッセージを返し、利用できない場合は空の文字列を返す別のwcfメソッドを呼び出すことを考えましたが、これを達成するための最良の方法があると思います.

javascript で wcf イベントに登録する方法があれば素晴らしいと思います。

// javascript code:
MyWcfNamespace.MyWcfClass instance = new ..();
instance.OnNewMessageAvailable = myJavascriptCallBackFunction;
// And on CallBack function..
function myJavaScriptCallbackFunction(msg) {
alert('new message arraived:' + msg):
}

明らかに、私の wcf サービスは、必要なすべての通知を管理するために静的イベントを実装する必要があります。

任意の提案をいただければ幸いです。ありがとうございました。

4

2 に答える 2

4

WCFを使用すると、これを達成するために、長いポーリングなどの手法を使用してそれを行うことができますが、明らかにこれは非常に簡単ではありません。方法については、この例を見てください

この作業を簡単にするJSライブラリがたくさんあります。SignalRはそれらの1つです。方法についてはこのWikiを参照してください。

アップデート2

Wcf 4.5を使用している場合、このタスクを実行する別の方法はWebソケットを使用することです。チャットアプリケーションには、プルベースのテクノロジーではなくプッシュベースのテクノロジーが必要です。Wcf 4.5は、WebSocketをサポートすることでこのパワーを提供します。

アップデート3

ロングポーリングを使用することにした場合は、非同期メソッドを使用する必要はありません。ロングポーリングは次のように機能します。

  1. サーバーにリクエストを送信します。
  2. 応答が来るまで待つか、タイムアウトします
  3. クライアントに移動し、別のリクエストを行います。

したがって、非同期結果を使用する代わりに(JSからのWebサービスへの呼び出しはすでに非同期であるため)、WaitOne(新しい要求が来るまで待機するため)やManualResetEventなどのスレッド信号技術を使用した通常のメソッドを使用して信号を送信します。

応答は常に最新であるため、長いポーリングはポーリングよりもはるかに優れていることに注意してください。

Wcfとロングポーリングを使用したチャットサーバーのこの実装を見てください

于 2012-08-03T04:42:35.510 に答える
1

永続的な接続を確立するためにWebsocketを使用することもできます。

また、この SignalRの例も役立ちます。

于 2012-08-03T05:29:48.443 に答える