72

我已经设置了一个 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")但我不能让它工作的东西。

对此的任何帮助将不胜感激

4

5 回答 5

111

这是 SignalR 2.x 的正确方法:

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

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

更多信息可以在官方文档中找到。

于 2012-06-06T12:54:25.060 回答
23

Hub.GetClients 在 0.4.0 版本中消失了。

wiki你现在可以使用:

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
于 2012-02-07T17:26:03.700 回答
6

您可以按照以下 2 步轻松使用集线器-

  1. 通过像这样的依赖注入进行实例化-

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

2.使用hub这样的对象-

_hub.Clients.All.onBulletinSent(bulletinToSend);

更多可以在这里找到。

示例代码可以在这个 git repo中找到。

于 2017-01-06T07:03:11.233 回答
1

https://github.com/SignalR/SignalR看看它是如何完成Chat.cs的。SignalR.Samples.Hubs.Chat

我可以在那里看到 staticDictionary<TKey, TValue>正在顶部实例化,所以我想它们也被持久维护,要么Chat类是持久实例(?),要么该数组以某种方式更新。

看看吧,大卫福勒可能是这方面最好的。

于 2011-10-03T11:24:55.223 回答
1

这在 .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;
    }
于 2019-09-20T12:04:42.283 回答