複数のハブクラスを使用できる複数のページがある場合、これを管理する最良の方法は何ですか?
例えば:
Webサイトの別のページに移動し、前のページで開いていた同じハブクラスへの接続を基本的に「再開」するのは悪いことですか?
ページ上で複数のハブ接続を開くことは、それらがすべて異なるハブクラスであっても、すべて1つの接続に統合されているので問題ないと思いますか?
サイトで1つの接続を共有する複数のハブを持つことができます。 SignalR 2.0は、パフォーマンスを損なうことなく、1つの信号接続で複数のハブを処理するように更新されました。
公式ドキュメント: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#multiplehubs
すべてのクライアントは同じURLを使用してサービス(「/ signalr」または指定した場合はカスタムURL)とSignalR接続を確立し、その接続はサービスで定義されたすべてのハブに使用されます。
単一のクラスですべてのハブ機能を定義する場合と比較して、複数のハブのパフォーマンスに違いはありません。
ハブで開始するには、 ハブのWIKIエントリ および ハブのクライアント側 をお読みください。複数ページのコンテキストに応じていくつかのことがあります。
例:
2つの部分からなるページがあります。リアルタイムのユーザーアクティビティを示すグラフと、ユーザーが行ったリアルタイムのデータ変更を表として表示する領域です。 2つのハブまたは2つのグループを作成しますか?同じグラフとデータテーブルを使用する他のページがあります。
私のソリューション:
ページを切り替えると、クライアントは同じハブに接続してgetGraphまたはgetDataTableまたはその両方を要求し、クライアントに関連データを入力します。同様に、サーバーでデータが変更された場合、クライアント側のメソッドを呼び出してすべてのクライアントを更新するか、それらのグループ(この複雑さを追加できます)
申請書を見ている生徒と教師がいると仮定します。異なるレベルのデータアクセスが必要です。グループを使用してハブ上でグループを分けておくと、教師情報を生徒に送信したり、生徒データを教師に送信したりすることができません。
「悪い」と「良い」という質問に戻ると、これは実際のアプリケーションのコンテキストなしに確立することは困難です。 パフォーマンス とは別に、複数のハブを正当化できるシナリオは考えられません。
残念ながら、これはSignalRの新しい「コア」バージョンではもう不可能です。
https://github.com/aspnet/SignalR/issues/456
https://github.com/aspnet/SignalR/issues/955
IOSでは、サーバーごとに4つの接続の制限があります。
現在、WebSocketにはこの制限はありません(32になると思いますが、確かではありません)。 ただし、私はSafariであらゆる種類の問題を抱えている自己署名証明書を使用しています-したがって、実際には長いポーリングに落ちます(そしてそれが完了したことは明らかではありませんそう)。
だから私はこれらの接続で終わった:
したがって、ハブが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つのハブで簡単にできます。注意しないと、「接続が失われました。」という3つのダイアログボックスが表示されます。リトライ?'このため、単一のハブに切り替えています。
私はすべてを混ぜるのが嫌いですが、部分クラスは助けになり、私は個人的に多くのSignalRメソッドを持っていません。
これはデバッグにのみ関連しており、自己署名したhttps証明書を使用していることを前提としています。
代わりにletsencryptのようなものを使用するか、Cloudflareのargo tunnelを使用して、公的に信頼された証明書を取得してください。これはSafariによって完全に信頼されるため、接続は実際のWebソケットにアップグレードされます。
自己署名ルート証明書(CA)を作成し、それからドメイン名を使用してSSL証明書を生成します。
これは想像していたよりもトリッキーでした。結局、私はSubject Type=CA
私のルート証明書-iOSに必要です。この「拡張子」がなければ、ルートとして証明書をプロファイルとしてインストールしますが、SSL用に証明書を選択することはできません。
ルート証明書をインストールすると、Safariはwebsocketで問題なく動作します。
Httpのみを使用します。 Facebook/Google/Paymentのような特定のAPIを使用し、httpsを必要とするため、これは私にとって選択肢ではありませんでした。
最初に1つのハブを使用することをお勧めします。ただし、iOSがwebsocketで動作するように、証明書を適切にインストールすることをお勧めします。