从系统的其他地方调用 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()

不幸的是,它没有那么简单,因为 Client 不是静态的,所以不能从静态方法访问。

通过查看 SignalR 源代码,我发现了一个看起来很有前途的方法,Hubs.Invoke(string hubName, string method, params object[] args),所以我希望我可以使用类似于 Hubs.Invoke("Hooking", "Test")的东西,但是我不能让它工作。

如果有任何帮助,我将不胜感激

64895 次浏览

看看它是如何做的 Chat.csSignalR.Samples.Hubs.Chathttps://github.com/SignalR/SignalR

我可以看到静态 Dictionary<TKey, TValue>在顶部被实例化,所以我想它们也被持久化维护,要么 Chat类是一个持久化实例(?)或者那个数组被更新了。

你看 David Fowler 可能是这方面的佼佼者。

Hub. GetClients 在0.4.0版中已经消失。

维基百科你现在可以使用:

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

这是对于 SignalR2.x 的正确方法:

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

基本上,您可以使用当前主机的依赖解析器来解析 IConnectionManager接口,该接口允许您获取集线器的上下文对象。

进一步的信息可以在 正式文件中找到。

你可以很容易地使用 中心通过遵循这两个步骤-

  1. 通过这样的依赖注入实例化

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

2.Using the hub object like this-

_hub.Clients.All.onBulletinSent(bulletinToSend);

更多可以找到 译自: 美国《科学》杂志网站(https://www.asp.net/signalr/view/guide-to-the-api/hubs-api-guide-server # callfrom outsidehub)原著: http://www.asp.net/signalr/view/guide-to-the-api/hubs-api-guide-server

示例代码可以找到 NetCoreWithSignalR _ and _ SQLite/blob/master/src/Mcp/Controllers/api/Admin/BulletinController.cs”rel = “ norefrer”>

这在.NET core2中已经改变了,现在你可以像这样使用依赖注入:

    private readonly IHubContext<MyHub,IMyHubInterface> _hubContext;


public MyController(MyHub,IMyHubInterface hubContext)
{
_hubContext = hubContext;
}


public bool SendViaSignalR()
{
_hubContext.Clients.All.MyClientSideSignalRMethod(new MyModel());
return true;
}