2011-10-03 141 views
68

我已经建立了一个SignalR集线器来在服务器和客户端之间进行通信。中心服务器端代码存储在名为Hooking.cs的类中。我想要的是能够调用Hooking.cs中定义的方法,以允许我从应用程序中的任何位置向任何连接的客户端广播消息。看来,Hooking.cs的新实例为每个客户端/服务器调用创建的,所以我希望我将能够使用像从系统中的其他地方调用SignalR集线器客户端

var hooking = new Hooking(); 
hooking.Test(); 

与方法测试()在Hooking.cs定义如

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

但也许你可以帮助我;)任何想法如何在您的广播消息中为所有其他客户端执行您的js代码,而不是发出消息的始发呼叫者? :) – GONeale

+0

不幸的是我没有。我一直在处理这个客户端,发送客户端ID与响应,并且根本不调用该函数,如果ID匹配 –

回答

1

看一看它是如何在Chat.cs做过SignalR.Samples.Hubs.Chathttps://github.com/SignalR/SignalR

我可以在那里看到静态Dictionary<TKey, TValue>正在实例化的顶部,所以我想他们也被永久保持,无论是Chat类是持久化实例(?)还是该数组以某种方式被更新。

检查一下,大卫福勒可能是最好的。

+0

是的,我使用SignalR示例来尝试和解决这个问题。字典是静态的,所以信息在类的多个实例中保持不变,这就是为什么我希望我可以简单地创建一个Hooking.cs实例并使用它,但它不起作用 –

23

Hub.GetClients在版本0.4.0中消失。

wiki您现在可以使用:

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

并且不要忘记添加'使用SignalR.Infrastructure;' – nmat

101

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

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

基本上,你可以使用依赖解析器当前主机解决接口问题,该接口允许您查看集线器的上下文对象。

更多信息可在official documentation中找到。

5

可以很容易地通过以下这2步进

  1. 通过依赖注入实例化像这 -

    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

相关问题