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

Posted

技术标签:

【中文标题】如何在 hubpipleline 之外使用 SignalR 集线器实例【英文标题】:How to use SignalR hub instance outside of the hubpipleline 【发布时间】:2013-02-14 04:57:25 【问题描述】:

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

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

我收到如下错误消息:

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

【问题讨论】:

【参考方案1】:

你需要使用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 对此进行了更详细的描述。

【讨论】:

"context.Clients.All.Send" 不会广播回调用者,只会广播给其他人。有什么想法吗? 如果您使用的是GetHubContext,则没有调用者,因为这是在集线器之外使用的。 Clients.All 应该针对当前连接到集线器的每个客户端。 我有相同的代码,但是方法 Send 或任何其他方法都不会被调用。 这不会给你一个集线器的实例,它给你一个IHubContext的实例。您不能使用它来调用集线器方法。 这对我有用,只需一项更改:context.Clients.All.broadcastMessage("Admin", "stop the chat"); 使用广播消息而不是发送。【参考方案2】:

对于那些可能想知道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("...")*/;

微软文档在这里:Send SignalR messages from outside the hub。

【讨论】:

以上是关于如何在 hubpipleline 之外使用 SignalR 集线器实例的主要内容,如果未能解决你的问题,请参考以下文章

云原生社区 SIG 管理规范

如何防止 JA-SIG CAS spring 安全重定向循环?

python带bom的utf-8-sig如何去掉bom

fscanf (filepointer, "%d\n%lg\n", sig_length, sample_rate);如何解释它?

如何获得积分的上限?

线程与线程控制