サーバーとクライアント間で通信するために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")
などのようなものを使用できると期待していますが、機能しません。
これに関するヘルプは大歓迎です
これは、SignalR 2.xの正しい方法です。
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(message);
基本的に、現在のホストの依存関係リゾルバーを使用して、ハブのコンテキストオブジェクトを取得できるIConnectionManager
インターフェイスを解決できます。
詳細については 公式ドキュメント をご覧ください。
Hub.GetClientsはバージョン0.4.0で消滅しました。
wiki から、次を使用できるようになりました。
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
この2つの手順に従うことにより、hubを簡単に使用できます。
このような依存性注入によるインスタンス化-
public class ClassName
{
........
........
private IHubContext _hub;
public BulletinSenderController(IConnectionManager connectionManager)
{
_hub = connectionManager.GetHubContext<McpHub>();
........
........
}
............
............
}
2. hub
オブジェクトを次のように使用する
_hub.Clients.All.onBulletinSent(bulletinToSend);
もっと見つけることができますここ.
サンプルコードを見つけることができますこのgitリポジトリ内.
Chat.cs
in SignalR.Samples.Hubs.Chat
from https://github.com/SignalR/SignalR 。
静的なDictionary<TKey, TValue>
は最上部でインスタンス化されているので、Chat
クラスが永続化されたインスタンス(?)であるか、その配列が何らかの形で更新されて永続的に維持されていると思います。
これを確認してください。おそらく、David Fowlerがこれに最適でしょう。