在控制器(ASP.NET 核心)中执行 DI 时如何在 SignalR 中使用 Clients.Caller 和 Clients.Others?

How to use Clients.Caller and Clients.Others in SignalR when doing DI in a Controller (ASP.NET Core)?

我正在将 SignalR 与 ASP.NET 核心一起使用:

public class NotificationHub : Hub
{
}
[Route("api/[controller]")]
[ApiController]
public class AController : ControllerBase
{
    private readonly IHubContext<NotificationHub> _hubContext;

    public AController(IHubContext<NotificationHub> hubContext)
    {
        _hubContext = hubContext;
    }
}

我发现我只能使用属性 Clients.CallerClients.Others

public class NotificationHub : Hub
{
        public void Test()
        {
            Clients.Caller.SendAsync("aMethod");
            Clients.Others.SendAsync("aMethod");
        }
}

虽然使用 IHubContext<NotificationHub> 我只能访问:

_hubContext.Clients.All

有什么方法可以访问 Hub 外部的 Clients.CallerClients.Others 属性?

您的 SignalR 客户端仅与集线器通信,因此您永远不会在控制器中拥有 "Caller",仅在集线器中。

您传递给控制器​​的 HubContext 可用于将消息发送回任何已注册的连接,方法是向所有连接 ID 或向选定的一组连接 ID 广播。

因此,如果您可以将控制器用户与连接 ID 匹配,则可以通过发出 Clients.Client("connection-id") 来获得相当于 Clients.Caller 的效果,并通过使用 [=13] 获得 Clients.Others 的效果=] 或类似的。

MS 会提供没有 CallingClinet 的 IHuBContext 完全没有意义。

调用客户端总是存在的,唯一的获取方式就是依赖注入。 女士真丢人。