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

配置Serilog后.NET Core 3.1的500错误响应不返回异常信息如何解决

问题根因

该问题核心原因是中间件注册顺序错误。.NET Core 中间件按注册顺序正向执行、反向处理响应,UseDeveloperExceptionPage() 必须注册在所有可能抛出异常的业务中间件、日志中间件之前,才能捕获到后续中间件抛出的异常并渲染到响应体。如果 Serilog 相关中间件注册在它前面,异常会先被 Serilog 捕获处理,开发异常页中间件无法收到未处理的异常,自然无法返回异常详情。

解决步骤
  • 调整中间件注册顺序
    打开 Startup.cs 的 Configure 方法,确保非生产环境下 UseDeveloperExceptionPage() 是首个注册的中间件,Serilog 相关中间件必须放在它之后注册,示例配置如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 非生产环境优先注册开发异常页,必须放在所有业务、日志中间件之前
    if (env.IsDevelopment() || env.IsStaging())
    {
        app.UseDeveloperExceptionPage();
    }

    // Serilog 请求日志中间件注册位置必须在开发异常页之后
    app.UseSerilogRequestLogging();

    // 后续注册路由、授权、端点映射等其他中间件
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
  • 检查自定义异常处理逻辑
    如果实现了自定义的 Serilog 异常捕获中间件,不要在非生产环境下设置 context.ExceptionHandled = true,该标记会告知上层中间件异常已处理完成,不会继续传递给开发异常页:
// 错误示例:全局标记异常已处理
app.Use(async (context, next) =>
{
    try
    {
        await next();
    }
    catch (Exception ex)
    {
        Log.Error(ex, "接口请求异常");
        context.Response.StatusCode = 500;
        // 非生产环境下删除下面这行配置,允许异常继续向上传递
        // context.ExceptionHandled = true;
    }
});
  • 移除冲突的异常处理配置
    非生产环境不要同时注册 UseExceptionHandler 和 UseDeveloperExceptionPage,前者优先级更高,会覆盖开发异常页的渲染逻辑。
验证效果

完成配置调整后重启服务,主动触发已知的500异常,此时响应体可直接返回完整的异常堆栈、错误详情,同时 Serilog 也会正常记录异常日志,两者功能互不冲突。

内容的提问来源于stack exchange,提问作者user15716642

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:42:04