[解決済み] SignalR 2.0 .NETクライアントとサーバーハブを再接続するためのベストプラクティス
質問
モバイルアプリケーションでSignalR 2.0と.NETクライアントを使用していますが、さまざまな種類の切断を処理する必要があります。SignalRクライアントが自動的に再接続されることもあれば、次のように直接再接続しなければならないこともあります。
HubConnection.Start()
を呼び出して直接再接続する必要がある場合もあります。
SignalRは魔法のように自動で再接続することがあるので、機能または設定を見逃しているのでは?
自動的に再接続するクライアントを設定する最善の方法は何ですか?
を処理する javascript の例を見たことがあります。
Closed()
イベントを処理し、n秒後に接続するJavaScriptの例を見ました。何か推奨されるアプローチはありますか?
私は のドキュメントを読みました。 やSignalRの接続の寿命に関するいくつかの記事を読みましたが、クライアントの再接続をどのように処理するのかがまだ不明です。
どのように解決するのですか?
私は最終的にこれを理解しました。この質問を始めてから、私が学んだことは以下の通りです。
背景です。 Xamarin / Monotouchと.NET SignalR 2.0.3クライアントを使用してiOSアプリを構築しています。私たちは、デフォルトの SignalR プロトコルを使用しています - そして、それは Web ソケットの代わりに SSE を使用しているようです。Xamarin / MonotouchでWebソケットを使用することが可能かどうかは、まだわかりません。すべてはAzureのウェブサイトを使用してホストされています。
私たちは、アプリが SignalR サーバーにすばやく再接続する必要がありましたが、接続が勝手に再接続されない、または再接続にちょうど 30 秒かかる (基本的なプロトコルのタイムアウトによる) 問題が発生し続けました。
最終的に、3 つのシナリオをテストしました。
シナリオ A - アプリが最初にロードされたときに接続する。 これは初日から完璧に機能しました。接続は、3G モバイル接続でも 0.25 秒未満で完了します。(ラジオがすでにオンになっていると仮定して)
シナリオB - アプリが30秒間アイドル/クローズした後にSignalRサーバーに再接続する。 このシナリオでは、SignalR クライアントは特別な作業をしなくても、最終的に勝手にサーバーに再接続しますが、再接続を試みる前にちょうど 30 秒間待つようです。(私たちのアプリでは遅すぎます)。
この 30 秒の待機期間中に、HubConnection.Start() を呼び出してみましたが、何の効果もありませんでした。また、HubConnection.Stop() を呼び出しても、30 秒かかります。私は以下を見つけました。 に関連するバグがありましたが、これは解決されたようです。 を見つけましたが、v2.0.3でもまだ同じ問題があります。
シナリオ C - アプリが 120 秒以上アイドル/クローズされた後に SignalR サーバーに再接続する。
このシナリオでは、SignalR トランスポート プロトコルがすでにタイムアウトしているため、クライアントが自動的に再接続されることはありません。これは、クライアントが時々、しかし常に自分自身で再接続するわけではない理由を説明しています。良いニュースは、HubConnection.Start()を呼び出すと、シナリオAのようにほとんど即座に動作することです。そのため、アプリが 30 秒間閉じているか、120 秒以上閉じているかによって、再接続の条件が異なることに気づくのにしばらくかかりました。また、SignalR のトレース ログは、基礎となるプロトコルで何が起こっているかを明らかにしますが、コードでトランスポート レベルのイベントを処理する方法があるとは思えません。(シナリオ B では 30 秒後に Closed() イベントが発生し、シナリオ C では即座に発生します。) これらの再接続待機期間中、State プロパティは "Connected" と表示します。
解決策 解決策は明らかです。SignalR が再接続の魔法をかけるのを待つのではありません。その代わりに、アプリが起動したとき、または電話のネットワーク接続が回復したときに、単にイベントをクリーンアップして HubConnection の参照を解除し(30 秒かかるので廃棄できませんが、ガベージ コレクションがそれを処理することを願っています)、新しいインスタンスを作成するのです。これで、すべてがうまくいくようになりました。なぜか、新しいインスタンスを作成するだけでなく、永続化された接続を再利用して再接続するべきだと思ったのです。
関連
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] すべてのサーバーサイドのコードでConfigureAwaitを呼び出すためのベストプラクティス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】IntPtrとは一体何なのか?