我正在使用SignalR向所有客户广播消息。我需要在集线器类之外触发广播,例如以下内容:
var broadcast = new chatHub();
broadcast.Send("Admin","stop the chat");
我收到以下错误消息:
不支持使用非HubPipeline创建的Hub实例。
我正在使用SignalR向所有客户广播消息。我需要在集线器类之外触发广播,例如以下内容:
var broadcast = new chatHub();
broadcast.Send("Admin","stop the chat");
我收到以下错误消息:
不支持使用非HubPipeline创建的Hub实例。
Answers:
您需要使用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");
使用broadcastMessage而不是Send。
对于那些可能想知道去哪里的人的一个小更新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消息。