You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

依赖注入场景下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:24:50