如何在中心线之外使用SignalR集线器实例


81

我正在使用SignalR向所有客户广播消息。我需要在集线器类之外触发广播,例如以下内容:

var broadcast = new chatHub(); broadcast.Send("Admin","stop the chat");

我收到以下错误消息:

不支持使用非HubPipeline创建的Hub实例。

Answers:


140

您需要使用GetHubContext

var context = GlobalHost.ConnectionManager.GetHubContext<chatHub>();
context.Clients.All.Send("Admin", "stop the chat");

有关详细信息,请参见http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub


4
“ context.Clients.All.Send”不会广播回呼叫者,而只会广播给其他呼叫者。有任何想法吗?
user384080 2013年

4
如果您正在使用GetHubContext,则没有呼叫者,因为它将在集线器之外使用。Clients.All应该针对当前连接到集线器的每个客户端。
halter73

5
我有相同的代码,但是不会调用Send方法或任何其他方法。
nAVID 2015年

5
这不会为您提供集线器的实例,而是为您提供的实例IHubContext。您不能使用它来调用中心方法。
乔治·莫尔

4
这对我来说只有一个更改:context.Clients.All.broadcastMessage("Admin", "stop the chat"); 使用broadcastMessage而不是Send。
车轮

4

对于那些可能想知道去哪里的人的一个小更新GlobalHost。.NET核心已完全重写SignalR。因此,如果使用的是SignalR.Core包(SignalR版本之间的差异),则可以通过将SignalR集线器上下文注入服务中来获得一个实例:

public class MyNeedyService
{
    private readonly IHubContext<MyHub> ctx;

    public MyNeedyService(IHubContext<MyHub> ctx)
    {
        this.ctx = ctx;
    }

    public async Task MyMethod()
    {
        await this.ctx.All.SendAsync("clientCall");
    }
}

并在Startup.cs

services.AddSignalR()/*.AddAzureSignalR("...")*/;

Microsoft文档在这里:从集线器外部发送SignalR消息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.