2015-09-04 40 views
3

在SignalR 2,你可以做这样的事情(从我的博客取):如何在SignalR 3中获得HubContext?

var stockTickerHub = GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>(); 

这让你从轮毂外部(例如从股票行情线程)获取到SignalR枢纽的参考。

这在SignalR 3中看起来似乎不可用。您如何在新的和即将推出的SignalR中实现同等功能?

回答

1

从我见过的每个示例以及我已经实现的少数SignalR 3应用程序中,您不再有对集线器的强类型引用。当前的方法通过集线器的名称和URL连接到集线器。 On泛型方法将创建一个订阅,以便从该集线器和您提供的方法名称进行广播。

HubConnection connection = new HubConnection(ServerURL); 
IHubProxy hubProxy = connection.CreateHubProxy("StockTickerHub"); 
hubProxy.On<StockTickerMessage>("[Your method name here]", msg => { 
    //your UI update logic here 
}); 
2

我问同样的事情到SignalR,大卫·福勒的创造者上Jabbr,一个论坛,SignalR的创造者和ASP.NET 5建筑师不时挂在的时候,他的回答这个问题是使用dependency injection

虽然我还没有与SignalR 3尝试过,我敢肯定你可以注入,在你的类实现IConnectionManagerConnectionManager一个实例,并使用它,就像你会使用GlobalHost解决您的枢纽环境。

再次,我没有这样做SignalR3,但我希望这会让你更接近寻找解决方案。我使用Autofac在我的集线器中注入依赖关系,但也在其他类中注入ConnectionManager的实例以获取集线器上下文)。

希望这会有所帮助。祝你好运!

2

依赖注入确实是这种方式和工作。

实施例:

public class ChatController : Controller 
{ 
    readonly IConnectionManager _connectionManager; 

    public ChatController(IConnectionManager connectionManager) 
    { 
     _connectionManager = connectionManager; 
    } 

    public IActionResult Chat(string message) 
    { 
     IHubContext context = _connectionManager.GetHubContext<ChatHub>(); 
     IConnection connection = _connectionManager.GetConnectionContext<PersistentConnection>().Connection; 

     context.Clients.All.NewMessage(message); 

     return new EmptyResult(); 
    } 
}