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

ASP.Net Core应用使用自定义Middleware实现全局异常处理不生效求助

问题排查与解决方案

1. 修正中间件注册逻辑

你当前的注册方式存在明显错误:

  • 手动new ExceptionHandlingMiddleware()调用的是空的无参构造函数,生成的实例里_next、logger都是空值,根本无法正常工作
  • 你误用了UseExceptionHandler内置中间件的配置方式,自定义中间件应该直接用UseMiddleware注册

修改步骤:

  1. 删掉ExceptionHandlingMiddleware里的空无参构造函数
  2. 在Configure方法第一行添加注册代码:
app.UseMiddleware<ExceptionHandlingMiddleware>();
  1. 删掉你现在写的app.UseExceptionHandler(new ExceptionHandlerOptions {...})整段配置

2. 验证Serilog配置

确认你已经完成Serilog的基础配置:

  • Program.cs启动时已经初始化Serilog,配置了文件输出Sink,且没有过滤Error级别的日志
  • 已经在宿主构造时调用了UseSerilog()将Serilog设为默认日志提供器

3. 适配GraphQL架构的特殊逻辑

你使用GraphQL是异常无法捕获的核心原因:所有GraphQL类库默认都会自行捕获Resolver层抛出的异常,封装到返回结果的errors字段中,不会把异常抛到上层的ASP.NET Core中间件管道。

解决方案根据你用的类库选择:

如果你用的是Hot Chocolate:

注册自定义错误过滤器处理异常并写日志,同时可选择配置是否把异常抛出到中间件:

services.AddGraphQLServer()
    .ModifyRequestOptions(opt => opt.ThrowOnAggregateError = true) // 配置异常抛出到中间件层
    .AddErrorFilter(error => {
        if (error.Exception != null)
        {
            // 这里写Serilog日志逻辑
            Log.Error(error.Exception, "GraphQL执行异常");
        }
        return error;
    });

如果你用的是GraphQL.NET:

配置执行选项开启异常抛出:

services.AddGraphQL(b => {
    b.AddSystemTextJson()
     .ConfigureExecutionOptions(opt => {
         opt.ThrowOnUnhandledException = true; // 异常会抛出到上层中间件
     });
});

内容的提问来源于stack exchange,提问作者Arjun D Nair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:57:02