SignalR 在应用依赖注入时断开连接
SignalR getting disconnected while applying Dependency Injection
我是 SignalR 的新手,使用 .NET 5 和 angular13 建立实时聊天。建立连接时出现此错误——连接因错误而关闭。 NullReferenceException
经过多次debagging,我找到了问题的根本原因。当我向消息中心注入任何依赖项时。发生 NullReferenceException 错误。没有依赖性,连接已正确建立。
这是我的 MessageHub.cs 代码(有依赖)
public class MessageHub : Hub
{
private readonly IMessageRepository _messageRepository;
private readonly IUserRepository _userRepository;
public MessageHub(IMessageRepository messageRepository, IUserRepository userRepository)
{
_messageRepository = messageRepository;
_userRepository = userRepository;
}
public override async Task OnConnectedAsync()
{
var httpContext = Context.GetHttpContext();
var otherUser = httpContext.Request.Query["user"].ToString();
var groupName = GetGroupName(Context.User.GetUsername(), otherUser);
await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
}
public override async Task OnDisconnectedAsync(Exception exception)
{
await base.OnDisconnectedAsync(exception);
}
}
Startup.cs(配置服务)
services.AddSignalR(e=>
{
e.EnableDetailedErrors = true;
});
Startup.cs(配置)
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<MessageHub>("hubs/message");
});
我非常需要这种依赖来完成我的功能。我对此很满意。如果我删除 Dependency 它工作正常。我试图从各种来源找到一些解决方案,但对我没有用。如果有人帮助我。对此我将不胜感激。
经过一些研究,我应用了一个对我有用的解决方案。我们可以检索服务对象。所以在 startup.cs 下面我做了什么
Startup.cs(配置服务)
//we can retrieve service object
public static IServiceProvider serviceProvider;
services.AddSignalR()
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<IMessageRepository, MessageRepository>();
在我的 MessageHub.cs 中,我没有使用依赖注入,而是检索了所需的服务并在下面的文件中定义它
MessageHub.cs
public class MessageHub : Hub
{
private readonly IMessageRepository _messageRepository;
private readonly IUserRepository _userRepository;
public MessageHub()
{
_messageRepository = (IMessageRepository)Startup.serviceProvider.GetRequiredService(typeof(IMessageRepository));
_userRepository = (IUserRepository)Startup.serviceProvider.GetRequiredService(typeof(IUserRepository));
}
// other code....
}
它对我有用。现在我可以从 IRepository 和 SignalR 实现我的必要方法也正常工作。
我是 SignalR 的新手,使用 .NET 5 和 angular13 建立实时聊天。建立连接时出现此错误——连接因错误而关闭。 NullReferenceException
经过多次debagging,我找到了问题的根本原因。当我向消息中心注入任何依赖项时。发生 NullReferenceException 错误。没有依赖性,连接已正确建立。
这是我的 MessageHub.cs 代码(有依赖)
public class MessageHub : Hub
{
private readonly IMessageRepository _messageRepository;
private readonly IUserRepository _userRepository;
public MessageHub(IMessageRepository messageRepository, IUserRepository userRepository)
{
_messageRepository = messageRepository;
_userRepository = userRepository;
}
public override async Task OnConnectedAsync()
{
var httpContext = Context.GetHttpContext();
var otherUser = httpContext.Request.Query["user"].ToString();
var groupName = GetGroupName(Context.User.GetUsername(), otherUser);
await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
}
public override async Task OnDisconnectedAsync(Exception exception)
{
await base.OnDisconnectedAsync(exception);
}
}
Startup.cs(配置服务)
services.AddSignalR(e=>
{
e.EnableDetailedErrors = true;
});
Startup.cs(配置)
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<MessageHub>("hubs/message");
});
我非常需要这种依赖来完成我的功能。我对此很满意。如果我删除 Dependency 它工作正常。我试图从各种来源找到一些解决方案,但对我没有用。如果有人帮助我。对此我将不胜感激。
经过一些研究,我应用了一个对我有用的解决方案。我们可以检索服务对象。所以在 startup.cs 下面我做了什么
Startup.cs(配置服务)
//we can retrieve service object
public static IServiceProvider serviceProvider;
services.AddSignalR()
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<IMessageRepository, MessageRepository>();
在我的 MessageHub.cs 中,我没有使用依赖注入,而是检索了所需的服务并在下面的文件中定义它
MessageHub.cs
public class MessageHub : Hub
{
private readonly IMessageRepository _messageRepository;
private readonly IUserRepository _userRepository;
public MessageHub()
{
_messageRepository = (IMessageRepository)Startup.serviceProvider.GetRequiredService(typeof(IMessageRepository));
_userRepository = (IUserRepository)Startup.serviceProvider.GetRequiredService(typeof(IUserRepository));
}
// other code....
}
它对我有用。现在我可以从 IRepository 和 SignalR 实现我的必要方法也正常工作。