.NET7中注册UseExceptionHandler导致中间件无法捕获异常的求助
问题分析与解决方案
原因解释
你的问题出在中间件的执行顺序和异常回溯逻辑上:
- ASP.NET Core的中间件是按注册顺序处理请求,但异常是从抛出点逆序回溯的。
- 你通过
IStartupFilter把HoneybadgerMiddleware加到了整个管道的最前端(早于UseExceptionHandler)。而UseExceptionHandler的核心逻辑就是捕获其后续中间链里的异常,直接跳转到/error处理,不会把异常再抛回给前面的中间件。 - 所以异步上下文抛出的异常被
UseExceptionHandler先截胡了,根本到不了HoneybadgerMiddleware的catch块。
解决方案
要让HoneybadgerMiddleware先捕获异常上报,再抛给UseExceptionHandler处理,必须调整中间件顺序:让HoneybadgerMiddleware在UseExceptionHandler之后注册。这样异常回溯时会先经过它,完成上报后再重新抛出,最终被UseExceptionHandler接收。
修改后的代码
public class Startup { private readonly IConfiguration _config; private readonly IWebHostEnvironment _env; // 补全构造函数注入(原代码遗漏了_config和_env的注入,否则无法正常使用) public Startup(IConfiguration config, IWebHostEnvironment env) { _config = config; _env = env; } public void ConfigureServices(IServiceCollection services) { // 保留Honeybadger客户端的注册逻辑 services .AddScoped<IHoneybadgerClient, HoneybadgerClient>(context => (HoneybadgerClient)HoneybadgerSdk.Init( new HoneybadgerOptions(_config.GetValue<string>("Honeybadger:ApiKey") ?? ""))); services.AddUmbraco(_env, _config) .AddBackOffice() .AddWebsite() .AddComposers() .Build(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 先注册异常处理中间件 app.UseExceptionHandler("/error"); // 再注册Honeybadger中间件,确保在异常处理中间件之后、Umbraco中间件之前 app.UseMiddleware<HoneybadgerMiddleware>(); app.UseUmbraco() .WithMiddleware(u => { u.UseBackOffice(); u.UseWebsite(); }) .WithEndpoints(u => { u.UseInstallerEndpoints(); u.UseBackOfficeEndpoints(); u.UseWebsiteEndpoints(); }); } } // HoneybadgerMiddleware的实现保持不变 public class HoneybadgerMiddleware { private readonly RequestDelegate _next; public HoneybadgerMiddleware(RequestDelegate requestDelegate) { _next = requestDelegate; } public async Task Invoke(HttpContext context, IHoneybadgerClient client) { try { await _next(context); } catch (Exception exception) { await client.NotifyAsync(exception); // 重新抛出异常,交给UseExceptionHandler处理 throw; } } }
关键说明
- 此时中间件管道的顺序是:
UseExceptionHandler→HoneybadgerMiddleware→ Umbraco相关中间件。请求进来时按这个顺序执行,异常回溯时则反过来:Umbraco抛出的异常先到HoneybadgerMiddleware的catch块完成上报,重新抛出后被UseExceptionHandler捕获,最终跳转到/error端点。 - 原代码中的
HoneybadgerStartupFilter可以直接移除,因为现在直接在Configure方法里注册中间件更直观易懂。
内容的提问来源于stack exchange,提问作者atoms
相关产品推荐
相关产品推荐

