如何在hubpipleline之外使用SignalR hub实例

Nit*_*wal 78 signalr signalr-hub

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

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

我收到错误消息:

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

hal*_*r73 134

你需要使用GetHubContext:

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

这在http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub中有更详细的描述.

  • "context.Clients.All.Send"不会向其他人广播回呼叫者.有任何想法吗? (4认同)
  • 如果您使用的是"GetHubContext",则没有调用者,因为这是在Hub之外使用的.`Clients.All`应该解决当前连接到Hub的每个客户端. (4认同)
  • 我有相同的代码,但不会调用方法Send或任何其他方法. (4认同)
  • 这不会为您提供集线器的实例,它会为您提供一个`IHubContext`的实例.您不能使用它来调用集线器方法. (3认同)
  • 这对我有一个改变:`context.Clients.All.broadcastMessage("Admin","停止聊天");`使用broadcastMessage而不是Send. (3认同)
  • 您确定这也适用于自托管 SignalR 实例吗? (2认同)

Max*_*ikh 5

对于那些可能想知道GlobalHost它去了哪里的人来说,这是一个小更新。SignalR 已针对 .net core 完全重写。因此,如果您正在使用 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

并在Startup.cs

services.AddSignalR()/*.AddAzureSignalR("...")*/;
Run Code Online (Sandbox Code Playgroud)

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