繁体   English   中英

如何在 ASP.NET controller 中正确注入 SignalR 集线器?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM