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

时间:2011-10-03 11:16:17

标签: c# javascript asp.net-mvc signalr signalr-hub

我已经建立了一个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")这样的东西,但是我无法使它工作。

对此的任何帮助都将非常感激

5 个答案:

答案 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)

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

  1. 通过依赖注入进行实例化 -

    public class ClassName
    {
        ........
        ........
        private IHubContext _hub;
    
        public BulletinSenderController(IConnectionManager connectionManager)
        {
            _hub = connectionManager.GetHubContext<McpHub>();
            ........
            ........
        }
    
        ............
        ............
    }
    
  2. 2.使用hub这样的对象 -

    _hub.Clients.All.onBulletinSent(bulletinToSend);
    

    可以找到更多 here

    示例代码可以在 in this git repo 找到。

答案 3 :(得分:1)

https://github.com/SignalR/SignalRChat.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;
    }