从系统的其他地方调用SignalR集线器客户端
我已经build立了一个SignalR集线器来在服务器和客户端之间进行通信。 中心服务器端代码存储在一个名为Hooking.cs的类中。 我想要的是能够调用Hooking.cs中定义的方法,以允许我从应用程序中的任何地方向任何连接的客户端广播消息。 看起来,每个客户端/服务器调用都会创build一个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);
基本上,您可以使用当前主机的依赖parsing器来parsingIConnectionManager
接口,该接口允许您查看集线器的上下文对象。
更多信息可以在官方文档中find。
Hub.GetClients在0.4.0版本中已经消失。
从维基你现在可以使用:
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); dynamic clients = connectionManager.GetClients<MyHub>();
您可以通过遵循这2个步骤轻松地使用集线器 ,
-
通过像这样的dependency injection来实例化 –
public class ClassName { ........ ........ private IHubContext _hub; public BulletinSenderController(IConnectionManager connectionManager) { _hub = connectionManager.GetHubContext<McpHub>(); ........ ........ } ............ ............ }
2.使用像这样的hub
对象 –
_hub.Clients.All.onBulletinSent(bulletinToSend);
更多可以在这里find。
代码示例可以在这个git仓库中find。
看看它是如何在https://github.com/SignalR/SignalR的; Chat.cs
中完成的。
我可以看到静态Dictionary<TKey, TValue>
正在实例化的顶部,所以我想他们也被持久地维护,无论是Chat
类是一个持久化的实例(?)或该数组正在更新。
检查一下,David Fowler可能是最好的。