首页 文章

从系统中的其他位置调用SignalR集线器客户端

提问于
浏览
71

我已经 Build 了一个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源代码,我遇到了一个看起来很有前途的方法,所以我希望我可以使用像_1307328这样的东西,但我不能让它工作 .

任何有关这方面的帮助将非常感激

4 回答

  • 6

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

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

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

    更多信息可以在official documentation找到 .

  • 1

    Hub.GetClients已在版本0.4.0中消失 .

    wiki您现在可以使用:

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

    您可以通过以下两步轻松使用 hub -

    • 通过像这样的依赖注入进行实例化 -
    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 找到 .

  • 23

    https://github.com/SignalR/SignalRSignalR.Samples.Hubs.Chat 中的 Chat.cs 是如何完成的 .

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

    看看,David Fowler可能是最好的 .

相关问题