web-dev-qa-db-ja.com

Webサイト上の複数のsignalR接続/ハブ

複数のハブクラスを使用できる複数のページがある場合、これを管理する最良の方法は何ですか?

例えば:

  • Webサイトの別のページに移動し、前のページで開いていた同じハブクラスへの接続を基本的に「再開」するのは悪いことですか?

  • ページ上で複数のハブ接続を開くことは、それらがすべて異なるハブクラスであっても、すべて1つの接続に統合されているので問題ないと思いますか?

22
anthonypliu

サイトで1つの接続を共有する複数のハブを持つことができます。 SignalR 2.0は、パフォーマンスを損なうことなく、1つの信号接続で複数のハブを処理するように更新されました。

公式ドキュメント: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#multiplehubs

すべてのクライアントは同じURLを使用してサービス(「/ signalr」または指定した場合はカスタムURL)とSignalR接続を確立し、その接続はサービスで定義されたすべてのハブに使用されます。

単一のクラスですべてのハブ機能を定義する場合と比較して、複数のハブのパフォーマンスに違いはありません。

25
Sam

ハブで開始するには、 ハブのWIKIエントリ および ハブのクライアント側 をお読みください。複数ページのコンテキストに応じていくつかのことがあります。

  1. ハブを起動すると、クライアントに複数のページで同じそのハブの場合(例で確認できる)のままのIDが与えられます。
  2. 同じハブへの接続を再度開くことは悪くありません。 hub.startクライアント側メソッドをすべてのページで実行している場合がありますが、そのクライアントが複数のウィンドウを開いたり、あるページから別のページに移動した場合、そのハブには同じ接続IDがあり、連絡を取り続けることができます。複数のハブの場合、ハブと接続IDを管理する必要があります。そのため、この質問は「複数のISPが異なるWebサイトのインターネット接続を提供しているのは悪いのか」というようなものです。あなたはそれらを持つことができますが、それはやり過ぎです。単一のISPでもすべてのページをサーバーに提供できます。
  3. 1つのページに複数のハブを配置することは理想的ではありませんが、機能します。答えは、問題に対する少しのコンテキストを必要としますが、一般に、グループまたは他のパラメーターベースのアプローチを使用して、同じ接続IDでさまざまな要求を区別できます。同じページに2つのハブがある場合より多くのリソースが必要な場合があります(これをテストする必要があります)パラメーターまたはグループを使用してメッセージングの異なる領域を分離するよりも。

例:

2つの部分からなるページがあります。リアルタイムのユーザーアクティビティを示すグラフと、ユーザーが行ったリアルタイムのデータ変更を表として表示する領域です。 2つのハブまたは2つのグループを作成しますか?同じグラフとデータテーブルを使用する他のページがあります。

私のソリューション:

  1. サーバーからリアルタイムデータを受信するために、アプリケーション用の単一のハブを作成します。
  2. サーバーでさまざまなメソッドを作成して、グラフポイントとデータテーブルを送信します。
  3. これらのグラフを使用するすべてのページでクライアント側メソッドを作成し、同じハブ上のサーバーメソッドと通信します。

ページを切り替えると、クライアントは同じハブに接続してgetGraphまたはgetDataTableまたはその両方を要求し、クライアントに関連データを入力します。同様に、サーバーでデータが変更された場合、クライアント側のメソッドを呼び出してすべてのクライアントを更新するか、それらのグループ(この複雑さを追加できます)

申請書を見ている生徒と教師がいると仮定します。異なるレベルのデータアクセスが必要です。グループを使用してハブ上でグループを分けておくと、教師情報を生徒に送信したり、生徒データを教師に送信したりすることができません。

  1. ハブ参加で、ロールまたは差別化機能に関連付けられたグループに参加するためにそれらを追加できます。
  2. すべてのクライアントに送信するときに、教師または生徒であるクライアントのグループに送信できるようになりました。教師や学生のために別のハブを作成するのではなく、それらはすべて同じハブ上にあります。

「悪い」と「良い」という質問に戻ると、これは実際のアプリケーションのコンテキストなしに確立することは困難です。 パフォーマンス とは別に、複数のハブを正当化できるシナリオは考えられません。

10
Farrukh Subhani

SignalRコア-不可能

残念ながら、これはSignalRの新しい「コア」バージョンではもう不可能です。

https://github.com/aspnet/SignalR/issues/456

https://github.com/aspnet/SignalR/issues/955


注:iOSおよび自己署名証明書に関する問題

IOSでは、サーバーごとに4つの接続の制限があります。

現在、WebSocketにはこの制限はありません(32になると思いますが、確かではありません)。 ただし、私はSafariであらゆる種類の問題を抱えている自己署名証明書を使用しています-したがって、実際には長いポーリングに落ちます(そしてそれが完了したことは明らかではありませんそう)。

だから私はこれらの接続で終わった:

  • 1-Angular/Webpack hot reload socket
  • 2-Web API呼び出し
  • 3-ハブナンバーワン
  • 4-ハブ番号2
  • 5-&#&#$&#$

したがって、ハブが3つしかない場合、Safariページ全体が青いバーでロックされます。 Web API呼び出しでさえブロックされました。

注:HTTP/2では この制限はなくなりました ですが、特に1つのハブに制限した方が良いでしょう'ホットリロードを使用しています。さらに、開発中にHTTP/2を設定することは必ずしも簡単な作業ではありません。


それで修正する方法は?

最初に(一時的に)Websocketのみを受け入れるようにハブを設定します。これにより、Safariでエラーが発生します(エラーがキャッチされ、アラートダイアログに表示されていることを確認してください)。

routes.MapHub<SignalRHub>("/rt", options =>
{
     // when run in debug mode only WebSockets are allowed
     if (Debugger.IsAttached) {
        options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets;
     }
});

これで、修正を確認できるようになります-デバッグモードで実行するか、「if」を削除します。

IOSの問題は、httpsトラフィック用の自己署名証明書を受け入れても、ブラウザにニースの小さな「ロック」シンボルが表示されたとしても、wss:プロトコルには適用されないことです。したがって、接続をwssにupgradedすることはできません。これが最大4でブロックする理由です。

解決策#1

すべてを1つのハブにまとめることができれば、簡単です:-)

また、接続が失われた場合、複数のハブが再接続ロジックを複雑にすることにも気付きました。 1つのハブで簡単にできます。注意しないと、「接続が失われました。」という3つのダイアログボックスが表示されます。リトライ?'このため、単一のハブに切り替えています。

私はすべてを混ぜるのが嫌いですが、部分クラスは助けになり、私は個人的に多くのSignalRメソッドを持っていません。

解決策2

これはデバッグにのみ関連しており、自己署名したhttps証明書を使用していることを前提としています。

代わりにletsencryptのようなものを使用するか、Cloudflareのargo tunnelを使用して、公的に信頼された証明書を取得してください。これはSafariによって完全に信頼されるため、接続は実際のWebソケットにアップグレードされます。

解決策3

自己署名ルート証明書(CA)を作成し、それからドメイン名を使用してSSL証明書を生成します。

これは想像していたよりもトリッキーでした。結局、私はSubject Type=CA私のルート証明書-iOSに必要です。この「拡張子」がなければ、ルートとして証明書をプロファイルとしてインストールしますが、SSL用に証明書を選択することはできません。

ルート証明書をインストールすると、Safariはwebsocketで問題なく動作します。

解決策#4

Httpのみを使用します。 Facebook/Google/Paymentのような特定のAPIを使用し、httpsを必要とするため、これは私にとって選択肢ではありませんでした。

ノート

  • 重要:次に、生産を検討します。ウェブソケットはさまざまな理由で利用できない可能性があることを認識してください。したがって、iOSに4つのハブが接続されている場合、ブロックが発生する可能性があります。あなたは危険に生きています。

最初に1つのハブを使用することをお勧めします。ただし、iOSがwebsocketで動作するように、証明書を適切にインストールすることをお勧めします。

ユーザーの操作なしでWindows 10でX.509自己署名証明書を作成およびインストールする方法

7
Simon_Weaver