ASP.Net Core应用使用自定义Middleware实现全局异常处理不生效求助
问题排查与解决方案
1. 修正中间件注册逻辑
你当前的注册方式存在明显错误:
- 手动
new ExceptionHandlingMiddleware()调用的是空的无参构造函数,生成的实例里_next、logger都是空值,根本无法正常工作 - 你误用了
UseExceptionHandler内置中间件的配置方式,自定义中间件应该直接用UseMiddleware注册
修改步骤:
- 删掉
ExceptionHandlingMiddleware里的空无参构造函数 - 在
Configure方法第一行添加注册代码:
app.UseMiddleware<ExceptionHandlingMiddleware>();
- 删掉你现在写的
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
相关产品推荐
相关产品推荐

