我已经建立了一个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")
这样的东西,但是我无法使它工作。
对此的任何帮助都将非常感激
答案 0 :(得分:109)
这是SignalR 2.x的正确方法:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(message);
基本上,您可以使用当前主机的依赖项解析程序来解析IConnectionManager
接口,该接口允许您获取集线器的上下文对象。
更多信息可在official documentation。
中找到答案 1 :(得分:23)
Hub.GetClients已在版本0.4.0中消失。
现在可以使用wiki:
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
答案 2 :(得分:6)
您可以按照以下两步轻松使用集线器 -
通过依赖注入进行实例化 -
public class ClassName
{
........
........
private IHubContext _hub;
public BulletinSenderController(IConnectionManager connectionManager)
{
_hub = connectionManager.GetHubContext<McpHub>();
........
........
}
............
............
}
2.使用hub
这样的对象 -
_hub.Clients.All.onBulletinSent(bulletinToSend);
可以找到更多 here 。
示例代码可以在 in this git repo 找到。
答案 3 :(得分:1)
从https://github.com/SignalR/SignalR的Chat.cs
SignalR.Samples.Hubs.Chat
查看Dictionary<TKey, TValue>
的完成情况。
我可以在那里看到静态Chat
被实例化在顶部,所以我想它们也是持久维护的,或者{{1}}类是持久化实例(?)或者那个数组以某种方式更新。
检查一下,David Fowler可能是最好的。
答案 4 :(得分:0)
.NET Core 2中这已更改,现在您可以像下面这样使用依赖项注入:
private readonly IHubContext<MyHub,IMyHubInterface> _hubContext;
public MyController(MyHub,IMyHubInterface hubContext)
{
_hubContext = hubContext;
}
public bool SendViaSignalR()
{
_hubContext.Clients.All.MyClientSideSignalRMethod(new MyModel());
return true;
}