web-dev-qa-db-ja.com

SignalRタイムアウトプロパティ

さまざまなタイムアウトプロパティを指定するこのリンクを見つけました: https://github.com/SignalR/SignalR/wiki/Configuring-SignalR

また、SignalRクライアントとSignalRサーバー間で切断と再接続がどのように行われるかについてのこの素晴らしい投稿( signalRでの再接続はいつ行われますか? )。

上記の投稿とは異なる状況を繰り返し説明します。

「ハブの再接続は、クライアントがオフラインになり、すぐに接続を回復したときに発生します。SignalR構成値は、主に次の例のタイムスタンプを決定するため、時間を逐語的に使用しないでください。

以下に、再接続動作を含むいくつかの例とその結果(時間形式m:ss)を示します。

状況1

0:00-クライアントがサーバーに接続し、OnConnectedがトリガーされます

0:10-ISPの問題が原因でクライアントが接続を失った(そして接続が失われたことに気付いた)

0:15-クライアントが接続を回復します

0:16-OnReconnectedイベントがトリガーされます

状況2

0:00-クライアントがサーバーに接続し、OnConnectedがトリガーされます

0:10-イーサネットケーブルを抜いたためにクライアントが接続を失った(接続が切断されていることに気づかない)

0:15-クライアントが接続を回復

ここでは2つのことが起こり得ます

A:0:16-何も起こらず、クライアントは以前の接続を続行します

B:0:〜45-クライアントはその切断を認識します*

B:0:46-クライアントは再接続状態に移行します

B:0:47-クライアントは正常に再接続し、OnReconnectedイベントがトリガーされます。

状況3

0:00-クライアントがサーバーに接続し、OnConnectedがトリガーされます

0:10-イーサネットケーブルを引っ張ったためにクライアントが接続を失った(切断されていることに気づかない)

0:〜45-クライアントは切断されたことを認識します*

0:46-クライアントは再接続状態に移行します

1:15-サーバーは、クライアントが長時間使用されていないと判断し、それを忘れて、クライアントが少し遅れて再接続した場合に受信する「切断」コマンドをキューに入れます。 ***

1:15-OnDisconnectがトリガーされます1:16-クライアントが接続を回復します

1:17-クライアントは「ソフト」再接続を実行します(OnReconnectedをトリガーしません)

1:18-クライアントが「切断」コマンドを取得

1:19-クライアントが「停止」を呼び出し、ソフト切断を実行します(OnDisconnectedをトリガーしません)

状況4

0:00-クライアントがサーバーに接続し、OnConnectedがトリガーされます

0:10-イーサネットケーブルを引っ張ったためにクライアントが接続を失った(切断されていることに気づかない)

0:〜45-クライアントは切断されたことを認識します*

0:46-クライアントは再接続状態に移行します

1:15-サーバーは、クライアントが長時間使用されていないと判断し、それを忘れて、クライアントが少し遅れて再接続した場合に受信する「切断」コマンドをキューに入れます。 ***

1:15-OnDisconnectがトリガーされます1:30-クライアントが再接続の試行を停止します(試行時間が長すぎます)**

1:30-クライアントが切断状態に移行します

  • クライアント側のキープアライブチェックによる:キープアライブがないためにクライアントがオフラインになったことを判別するために使用されます。ロングポーリングトランスポートには使用されません

**クライアント側の切断タイムアウトが原因:クライアントが長期間再接続していた時期を判断するために使用され、その間にサーバーがクライアントについて忘れていた可能性があります

***サーバー切断タイムアウトによる:クライアントをいつ忘れるべきかを決定するために使用されます。これは、サーバーで接続が切断されたとタグ付けされてから発生し始める期間です。最終的に、サーバーはクライアントのトピックの切断コマンドをキューに入れ、クライアントが(再接続した場合)新しい接続を開始する必要があることをクライアントに通知します。トピックがクリーンアップされると、コマンドはサーバーから消えます。」


私たちが見つけたのは、.NETSignalRクライアントとASP.NETMVC SignalRサーバーの間で頻繁に切断と再接続(上記の1と2)が発生し、再接続が発生しない切断(上記の3と4)も発生することです。 ServerSentEventsプロトコルが使用されていることがわかっています。

以下を調整(増加または減少)するために必要なタイムアウトプロパティを知るのは困難です。

  1. 切断および再接続の数を減らします。
  2. 状況3と4にはまったくなりません。

ここで注意すべき重要な点は、.NET SignalRクライアントは、実際には常にサーバーに接続されているWindowsサービスであるということです。

現在、デフォルトを維持しています。これは次のとおりです。

  • ConnectionTimeout = 110秒
  • DisconnectTimeout = 30秒
  • キープアライブ= 30秒

また、SignalR 1.0.1を使用しています。

17
smitra

タイムアウトが適切に設定されています。現在のリリースでは、クライアントが接続を維持することを保証するために、.netクライアントのクライアント側のキープアライブはありません。

次のリリースでは、.netクライアント側のキープアライブが提供されます。プロジェクトの開発ビルドを使用する場合は、現在、この機能を開発ブランチで利用できます https://github.com/SignalR/SignalR/tree/dev

また、参考のために、ここにあなたが見ているものに関連する問題があります https://github.com/SignalR/SignalR/issues/741

7

.NETクライアントは[〜#〜] not [〜#〜]まだこの動作をしていません。また、クライアントが突然接続を切断した場合、再接続されません。 1.1になります。

8
davidfowl

SignalR 1.0.1を使用していますか?再接続プロセスに関するテイラーの説明は、SignalRバージョン> = 1.0およびJSクライアントに適用されます。私が尋ねる理由は、SignalR> = 1.0では、KeepAliveDisconnectTimeoutの3分の1以下でなければならないためです。 KeepAliveDisconnectTimeoutを完全に等しくすることはできません。

ただし、1.0。*でDisconnectTimeoutの後にKeepAliveを設定すると、キープアライブはDisconnectTimeoutの3分の1に設定されます。あなたの場合、これは10秒のデフォルトになります。

SignalR 1.0で多くの問題が解決されたので、そうでない場合はアップグレードする価値があります。ただし、他の回答が指摘しているように、.NETクライアントはキープアライブチェックをサポートせず、ネットワークケーブルが1.1になるまで外されたことを認識しません。

追伸Connectionが切断されていることに気付いた場合は、いつでも手動で再起動できます。このシナリオでは、もちろん接続IDが変更されます。

4
halter73