从系统的其他地方调用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个步骤轻松地使用集线器

  1. 通过像这样的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可能是最好的。