在控制器(ASP.NET Core)中进行 DI 时,如何使用 SignalR 中的 Clients.Caller 和 Clients.Others?

Eho*_*ret 5 c# signalr asp.net-core

我将 SignalR 与 ASP.NET Core 结合使用:

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

    public AController(IHubContext<NotificationHub> hubContext)
    {
        _hubContext = hubContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class NotificationHub : Hub
{
        public void Test()
        {
            Clients.Caller.SendAsync("aMethod");
            Clients.Others.SendAsync("aMethod");
        }
}
Run Code Online (Sandbox Code Playgroud)

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

_hubContext.Clients.All
Run Code Online (Sandbox Code Playgroud)

有什么方法可以访问中心外的资源Clients.Caller并获取其属性吗?Clients.Others

Mar*_*sch 6

您的 SignalR 客户端仅与集线器通信,因此控制器中永远不会有“调用者”,而仅在集线器中。

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

因此,如果您可以将控制器用户与连接 ID 相匹配,则可以Clients.Caller通过发出 aClients.Client("connection-id")和 a Clients.Othersby usingClients.AllExcept(...)或类似命令来获得等效的效果。