【问题标题】:How to get SignalR IHubContext from DI in .NET Core 3.1?如何从 .NET Core 3.1 中的 DI 获取 SignalR IHubContext?
【发布时间】:2020-12-13 22:10:59
【问题描述】:

我有很多 Hub 并注册它们:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapHub<FinanceHub>("/hub/finance");
    endpoints.MapHub<PartnersHub>("/hub/partners");
    ...
    endpoints.MapHub<WarehousesHub>("/hub/warehouses");
    endpoints.MapControllerRoute("default", "{controller}/{action}/{id?}");
});

我注册了 SignalR:

services.AddSignalR(options =>
{
    options.EnableDetailedErrors = true;
    options.MaximumReceiveMessageSize = signalrMaxMessageLimit * 8192;
}).AddMessagePackProtocol(conf =>
{
    conf.FormatterResolvers.Clear();
    conf.FormatterResolvers.Add(CircularResolver.Instance);
});

它们用作 SignalR 集线器。但是当我尝试在 Microsoft.AspNetCore.Mvc.ControllerBase 中解决它们时:

private IHubContext<FinanceHub> financeHub => provider.GetRequiredService<IHubContext<FinanceHub>>();

public PaymentRegisterController(
    ILogger<ServiceController> logger,
    IServiceProvider _provider) : base(logger)
{
    provider = _provider;
}

我得到一个例外:

System.InvalidOperationException:没有服务类型 'Microsoft.AspNet.SignalR.IHubContext`1[Engy.Plantain.Procurement.Backend.Hubs.FinanceHub]' 已注册。

问题出在哪里?

【问题讨论】:

  • 您注册了端点。但是您是否注册了服务? services.AddSignalR(); ?
  • @Fildor No. 服务通过注册端点自动注册,不是吗?
  • 我上次检查的时候,你至少需要做services.AddSignalR();
  • @Fildor 哦,当然。我注册了 SignalR。我添加到帖子消息中。
  • 如果你进行 CTOR 注射,它是否有效?

标签: c# asp.net-core dependency-injection asp.net-core-webapi signalr-hub


【解决方案1】:

作为每个人,我确信,我想,这是我的错误。在 API 控制器中,我试图解析 Microsoft.AspNet.SignalR.IHubContext 而不是 Microsoft.AspNetCore.SignalR.IHubContext。 现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    相关资源
    最近更新 更多