依赖注入场景下SignalR事件无法被前端接收的问题
问题:SignalR集成日志包时手动记录场景下前端收不到消息
背景
我正在将SignalR集成到一个供AspNetCore项目使用的错误/异常日志包中,日志包提供两种错误记录方式:
- 手动方式:通过依赖注入的
ICustomLogger接口,调用_customLogger.LogError(...) - 自动方式:通过注册
IApplicationBuilder.UseExceptionHandler异常处理器,构建自定义日志实例并调用.LogError(...)
测试端点情况
为测试功能,我在消费该包的项目中创建了3个端点:
/UnhandledException(正常工作)
internal static async Task TestUnhandledException() { // 会被上述异常处理器捕获 // 日志记录成功,前端能收到SignalR消息,无问题 throw new NotImplementedException(); }
该端点抛出的异常会被异常处理器捕获,日志记录成功且前端能收到SignalR消息,无问题。
/SendMessage(正常工作)
public static async Task SendSignalRMessage(IHubContext<CustomLogger.SignalR.EventHub> hubContext) { // 使用包中依赖注入的EventHub上下文,不调用CustomLogger的方法 // 无问题 await hubContext.Clients.All.SendAsync("NewEvent", "Hello"); }
该端点使用依赖注入的EventHub上下文,不调用CustomLogger的方法,前端能正常收到消息,无问题。
/ExplicitTest(存在问题)
internal static async Task Test(ICustomLogger logger) { // 依赖注入的CustomLogger构造时注入了IHubContext<EventHub> // 日志记录成功,但前端收不到SignalR消息,有问题! var a = await logger.LogEventAsync(LogLevel.Info, "Manual event", "Is this message sent?"); }
该端点依赖注入的ICustomLogger(构造函数注入了IHubContext<EventHub>),日志记录成功,但前端无法收到SignalR消息。
EventHub注册代码
消费项目的Program.cs中通过以下代码注册EventHub:
app.UseEndpoints(ep => ep.MapHub<EventHub>("/Events"));
日志包核心代码
public class CustomLogger { private readonly IHubContext<EventHub> hubContext; public EventLogger(IOptionsSnapshot<LoggerSettings> settings, IHubContext<EventHub> hubContext) { this.hubContext = hubContext; } // 省略实际日志逻辑代码 private async Task SendEventAsync(Event evt) { if (this.hubContext == null) { await this.LogEventAsync(LogLevel.Warning, "Configuration Error", "SignalR hub context is null"); return; } var eventData = new NewEvent { EventId = evt.EventId, TimeStamp = evt.TimeStamp, Message = evt.Message, }; try { await this.hubContext.Clients.All.SendAsync(MessageType.NewEvent, eventData); } catch (Exception ex) { await this.LogExceptionAsync(LogLevel.Warning, ex); } } }
调试信息
手动日志时,注入的ICustomLogger的IHubContext显示有1个活跃连接,发送消息时无异常抛出,但前端始终无法接收该SignalR消息。
内容的提问来源于stack exchange,提问作者Hugo Buff
相关产品推荐
相关产品推荐

