web-dev-qa-db-ja.com

システムの他の場所からSignalRハブクライアントを呼び出す

サーバーとクライアント間で通信するためにSignalRハブをセットアップしました。ハブサーバー側のコードは、Hooking.csというクラスに格納されます。私が欲しいのは、Hooking.csで定義されているメソッドを呼び出して、アプリケーションのどこからでも接続されているクライアントにメッセージをブロードキャストできるようにすることです。 Hooking.csの新しいインスタンスは、すべてのクライアント/サーバー呼び出しに対して作成されるようですので、

_var hooking = new Hooking();
hooking.Test();
_

hooking.csで定義されているメソッドTest()など

_public static void Test() {
    Clients.test()
}
_

そして、クライアント側のJavaScriptで

_var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()
_

残念ながら、クライアントは静的ではないため、静的メソッドからはアクセスできないため、それほど単純ではありません。

SignalRのソースコードを見ると、Hubs.Invoke(string hubName, string method, params object[] args)という有望なメソッドに出くわしたので、Hubs.Invoke("Hooking", "Test")などのようなものを使用できると期待していますが、機能しません。

これに関するヘルプは大歓迎です

71
Jordan Wallwork

これは、SignalR 2.xの正しい方法です。

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(message);

基本的に、現在のホストの依存関係リゾルバーを使用して、ハブのコンテキストオブジェクトを取得できるIConnectionManagerインターフェイスを解決できます。

詳細については 公式ドキュメント をご覧ください。

109
Paolo Moretti

Hub.GetClientsはバージョン0.4.0で消滅しました。

wiki から、次を使用できるようになりました。

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
23
Greg Ennis

この2つの手順に従うことにより、hubを簡単に使用できます。

  1. このような依存性注入によるインスタンス化-

    public class ClassName
    {
        ........
        ........
        private IHubContext _hub;
    
        public BulletinSenderController(IConnectionManager connectionManager)
        {
            _hub = connectionManager.GetHubContext<McpHub>();
            ........
            ........
        }
    
        ............
        ............
    }
    

2. hubオブジェクトを次のように使用する

_hub.Clients.All.onBulletinSent(bulletinToSend);

もっと見つけることができますここ.

サンプルコードを見つけることができますこのgitリポジトリ内.

6
Abrar Jahin

Chat.cs in SignalR.Samples.Hubs.Chat from https://github.com/SignalR/SignalR

静的なDictionary<TKey, TValue>は最上部でインスタンス化されているので、Chatクラスが永続化されたインスタンス(?)であるか、その配列が何らかの形で更新されて永続的に維持されていると思います。

これを確認してください。おそらく、David Fowlerがこれに最適でしょう。

1
GONeale