82

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

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

我收到错误消息:

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

4

2 回答 2

144

您需要使用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中有更详细的描述。

于 2013-02-28T05:39:01.177 回答
5

对于那些可能想知道GlobalHost它去了哪里的人来说,这是一个小更新。SignalR 已针对 .net 核心完全重写。因此,如果您使用 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 消息

于 2018-10-12T06:54:20.183 回答