.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;
我正在开发一个简单的 .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;