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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:17:55