[英]How do you get a reference to an ASP.NET Core SignalR hub context outside of a controller?
[英]How do I correctly inject a SignalR hub in an ASP.NET controller?
当向端点发出请求时,我正在尝试使用 SignalR 通过 websocket 发送更新。 但是,我正在努力为相关的 Controller 注入一个集线器依赖项。 我有一个 controller 和以下 GET function:
[HttpGet]
public IEnumerable<Zaal> GetZaal()
{
new BoekingUpdateHub().SendData("Test");
foreach(Stoel s in _context.Stoel)
{
Console.WriteLine(s.Id);
}
return _context.Zaal;
}
问题是,当我尝试使用此端点时,集线器未正确实例化,因为
public class BoekingUpdateHub : Hub
{
public async Task SendData(string data)
{
await Clients.All.SendAsync("ReceiveData", data);
}
}
在 await Clients.All 上给我一个 null 参考异常,因为 Clients 是 null
我试过使用依赖注入来解决这个问题,但它给了我:
System.InvalidOperationException:在尝试激活“WDPR.Controllers.ZaalController”时无法解析类型“WDPR.Hubs.BoekingUpdateHub”的服务。
我环顾四周,找不到解决方案,我完全不知道如何正确实施。
我想到了。 不是将集线器作为参数放入构造函数中,而是将 IHubContext 添加为参数,在这种情况下,T 是您要实际使用的集线器(在我的示例中,集线器称为 MyHub)
private readonly DbTheaterLaakContext _context;
private readonly IHubContext<MyHub> _hubContext;
public ZaalController(DbTheaterLaakContext context, IHubContext<BoekingUpdateHub> hubContext)
{
_context = context;
_hubContext = hubContext;
}
然后,您可以在 Endpoint 函数之一中创建 Hub:
[HttpGet]
public IEnumerable<Zaal> GetZaal()
{
new MyHub(_hubContext).SendData("Zaal GET request received");
}
最后,确保 IHubContext 是 Hub 构造函数中的一个参数:
public class MyHub: Hub
{
protected IHubContext<MyHub> _context;
public MyHub(IHubContext<MyHub> context)
{
this._context = context;
}
public async Task SendData(string data)
{
await _context.Clients.All.SendAsync("ReceiveData", data);
}
}
现在,请注意我们正在使用 IHubContext 作为我们客户端的源,这可以防止客户端成为 null。执行这些步骤允许您在端点收到请求时通过 SignalR websocket 发送信息。
配置controller如下
public class DemoController : ControllerBase
{
private readonly IHubContext<MyHub> _hubContext;
public DemoController(
IHubContext<MyHub> hubContext
)
{
_hubContext = hubContext;
}
[HttpGet]
public IEnumerable<Zaal> GetZaal()
{
_hubContext.Clients.All.SendData("Zaal GET request received");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.