【发布时间】:2013-02-14 04:57:25
【问题描述】:
我正在使用 SignalR 向我的所有客户广播消息。我需要在我的中心类之外触发广播,即如下所示:
var broadcast = new chatHub();
broadcast.Send("Admin","stop the chat");
我收到如下错误消息:
不支持使用不是由 HubPipeline 创建的 Hub 实例。
【问题讨论】:
标签: signalr signalr-hub
我正在使用 SignalR 向我的所有客户广播消息。我需要在我的中心类之外触发广播,即如下所示:
var broadcast = new chatHub();
broadcast.Send("Admin","stop the chat");
我收到如下错误消息:
不支持使用不是由 HubPipeline 创建的 Hub 实例。
【问题讨论】:
标签: signalr signalr-hub
你需要使用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 对此进行了更详细的描述。
【讨论】:
GetHubContext,则没有调用者,因为这是在集线器之外使用的。 Clients.All 应该针对当前连接到集线器的每个客户端。
IHubContext的实例。您不能使用它来调用集线器方法。
context.Clients.All.broadcastMessage("Admin", "stop the chat"); 使用广播消息而不是发送。
对于那些可能想知道GlobalHost 去了哪里的人来说,这是一个小更新。 SignalR 已针对 .net 核心完全重写。因此,如果您使用 SignalR.Core 包 (Difference between SignalR versions),您可以通过将 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("...")*/;
【讨论】: