3

Durandal を使用してシングル ページ アプリケーションを作成しており、いくつかの機能に SignalR を使用する予定です。まず、サーバーが送信する可能性のある通知をリッスンするトップ バーがあります。サイトは「TopBarNotificationHub」への接続を開始します。

ページの 1 つで、2 人のユーザーがこのページのデータを同時に編集する可能性があるため、別のハブに接続し、誰かがデータを更新したかどうかを通知したいと考えています。問題ありません。これで問題なく動作します。

しかし、そのページを離れるときに、2 番目のハブのみから切断したいのですが、これを達成する方法が見つかりません。私が言うなら、hub.connection.stop(); eTopBarNotificationHub への接続も停止します (共有されているため)。

1 つのハブプロキシを残し、もう 1 つのハブプロキシを存在させる方法はありますか?

これはSPAであるため、「シェル」はリロードされないため、ハブに再度接続しません...別のページがハブから切断されるたびにこれを強制的に再接続できるかもしれませんが、よりクリーンなソリューションがあるかもしれません. ..

前もって感謝します。

//J

4

1 に答える 1

7

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 クラスの別のクライアント セットを参照します。

于 2013-05-24T14:54:11.550 に答える