.NET 6 IHubContext 依赖注入

.NET 6 IHubContext Dependency Injection

我正在开发一个简单的 .NET 6 应用程序以在我们的前端应用程序中启用数据更新通知。我以前在 .NET 5 中构建过类似的东西,但我 运行 遇到了一个让我难过的 DI 问题。在 5 中,所有自动映射的集线器都有一个在容器中为它们设置的 IHubContext。在 6 中似乎不再是这种情况。

System.InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNet.SignalR.IHubContext`1[SignalRNotifications.Hubs.NotificationHub]' while attempting to activate 'SignalRNotifications.Controllers.NotificationController'.

我觉得 6 中新的非启动 DI 很奇怪,但我没有看到任何可用的说明如何修复它的信息。关于如何将 IHubContext 注入我的控制器有什么建议吗?

谢谢!

更新:这里是一些相关的代码:

using Microsoft.AspNetCore.Builder;
using SignalRNotifications.Hubs;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
builder.Services.AddSignalR().AddAzureSignalR();


var app = builder.Build();

// Configure the HTTP request pipeline.
app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<NotificationHub>("/NotificationHub");
});

app.Run();

依赖注入以最可预测的方式在控制器中完成:

namespace SignalRNotifications.Controllers
{
    [AllowAnonymous]
    [Route("api/[controller]")]
    [ApiController]
    public class NotificationController : ControllerBase
    {
        private readonly IHubContext<NotificationHub> _notificationContext;

        public NotificationController(IHubContext<NotificationHub> notificationContext)
        {
            _notificationContext = notificationContext;
        }

System.InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNet.SignalR.IHubContext`1[SignalRNotifications.Hubs.NotificationHub]' while attempting to activate 'SignalRNotifications.Controllers.NotificationController'.

此问题可能与您安装了错误版本的 SignalR 并添加了错误的命名空间引用有关。您正在使用 Microsoft.AspNet.SignalR.IHubContext,而不是 Microsoft.AspNetCore.SignalR.IHubContext

根据您的代码并参考Asp.net Core SignalR document, I create a sample and inject an instance of IHubContext in a controller,一切正常。但是我注意到在使用IHubContext时,我们需要添加using Microsoft.AspNetCore.SignalR;命名空间,像这样:

所以,请检查您的代码并尝试使用:

 using Microsoft.AspNetCore.SignalR;