1 つのページで複数のハブを使用しても問題はありませんが、それらは同じ接続を共有するため、更新を受信する以外にクライアントでより多くのリソースを消費することはありません。
したがって、「ハブとの接続と切断」を行うには、少し再設計する必要があります。サーバー側でクライアントの代わりにグループを使用する場合、(たとえば)Hub1.Register
メソッドを呼び出し、そのメソッドの関連するグループにクライアントを固定することで、ハブに「登録」できます。「登録解除」するには、(たとえば)を呼び出し、そのメソッドのグループからHub1.DeRegister
クライアントを削除します。ConnectionId
次に、更新をクライアントにプッシュするときに、 の代わりに Group を使用できますClients.All
。
(タグで指定しなかったため、サーバー言語は C# と見なされます)
- ハブ グループにクライアントを追加するには、次の手順を実行します。
Groups.Add(Context.ConnectionId, groupNameForHub);
- ハブ グループからクライアントを削除するには:
Groups.Remove(Context.ConnectionId, id.ToString());
- そのハブのクライアントにブロードキャストするには:
Clients.Group(groupNameForHub).clientMethodName(param1, param2);
ただし、混乱を招くように、Hub1 の「myGroup」という名前のグループは、Hub2 の「myGroup」という名前のグループとは別のものであることに注意してください。
これは、ドキュメントで推奨されている正確なアプローチです(後のバージョンで移動/変更された場合に備えて、ここにコピーされています)。
複数のハブ
アプリケーションで複数の Hub クラスを定義できます。これを行うと、接続は共有されますが、グループは分離されます。
• すべてのクライアントは同じ URL を使用してサービスとの SignalR 接続を確立し ("/signalr" またはカスタム URL を指定した場合)、その接続はサービスによって定義されたすべてのハブに使用されます。
単一のクラスですべてのハブ機能を定義する場合と比較して、複数のハブのパフォーマンスに違いはありません。
• すべてのハブが同じ HTTP 要求情報を取得します。
すべてのハブが同じ接続を共有するため、サーバーが取得する唯一の HTTP 要求情報は、SignalR 接続を確立する元の HTTP 要求に含まれるものです。接続要求を使用して、クエリ文字列を指定してクライアントからサーバーに情報を渡す場合、異なるクエリ文字列を異なるハブに提供することはできません。すべてのハブが同じ情報を受け取ります。
• 生成された JavaScript プロキシ ファイルには、すべてのハブのプロキシが 1 つのファイルに含まれます。
JavaScript プロキシの詳細については、SignalR Hubs API Guide - JavaScript Client - The generated proxy and what it does for you を参照してください。
• グループはハブ内で定義されます。
SignalR では、名前付きグループを定義して、接続されたクライアントのサブセットにブロードキャストできます。グループは、ハブごとに個別に維持されます。たとえば、"Administrators" という名前のグループには ContosoChatHub クラスの 1 つのクライアント セットが含まれ、同じグループ名は StockTickerHub クラスの別のクライアント セットを参照します。