web-dev-qa-db-ja.com

SignalRは内部的にどのように機能しますか?

SignalRが内部的に高レベルでどのように機能するかを誰にも教えてもらえますか?

Response.Flushを使用してデータをフラッシュし、クライアント側では特定の間隔でAjaxリクエストを送信していると推測しています。それが正しいか?

154
user960567

いいえ、SignalRは接続の抽象化です。その接続を介して2つのプログラミングモデル(ハブと永続的な接続)を提供します。 SignalRにはトランスポートの概念があり、各トランスポートはデータの送受信方法、および接続と切断の方法を決定します。

SignalRには、組み込みのトランスポートがいくつかあります。

  1. WebSockets
  2. サーバー送信イベント
  3. 永遠のフレーム
  4. 長いポーリング

SignalRは、サーバーとクライアントがサポートする「最適な」接続を選択しようとします(特定のトランスポートを使用するように強制することもできます)。

それが高レベルです。各トランスポートの実装方法を確認するには、 ソースコード をご覧ください。

各トランスポートのクライアントコードもあります。 https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS

特に長いポーリング転送がどのように機能するかについて質問している場合:

シグナルが応答するのを非同期に待機しているサーバーにajaxリクエストを送信します。信号があるか、要求がタイムアウトになると、サーバーから戻って別の要求を送信し、プロセスが続行されます。 (クライアントがメッセージを見逃さないように、クライアントが見たものをどのように追跡するかについての詳細は省略しました)

それがあなたの質問のほとんどに答えることを願っています。

233
davidfowl

@davidfowlはすでに主要部分に回答しています。ただし、トランスポートの動作、特にWebSocketと他のトランスポートの動作の違いに関する詳細を提供するため。以下はいくつかのポイントです。

  • WebSocketは、クライアントとサーバー間の真の永続的な双方向接続を確立する唯一のトランスポートです。ただし、WebSocketはIIS 8以上、およびInternet Explorerの最新バージョンであるGoogle ChromeおよびMozilla Firefox。
  • Server Sent Events、Forever Frame、およびLong pollingでは、3つすべてが一方向の通信に従っており、ほとんどのブラウザーでサポートされています。
2
shivam