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

.NET 6 Minimal APIs异常返回HTML而非application/problem+json如何处理?

原因说明

ASP.NET Core 6及以上版本使用WebApplication.CreateBuilder初始化项目时,会默认在Development环境下自动注入开发者异常页中间件,不需要手动编写app.UseDeveloperExceptionPage()代码,这就是你未添加对应配置依然返回HTML异常页的核心原因。VS运行项目时默认会把ASPNETCORE_ENVIRONMENT环境变量设置为Development,刚好触发了这个默认逻辑。

非VS运行时的行为差异

不在VS中运行时,实际表现由当前生效的ASPNETCORE_ENVIRONMENT环境变量值决定:

  • 未显式指定环境变量时默认值为Production,不会触发开发者异常页,默认返回不带详情的500空响应
  • 手动将环境变量设置为Development时,无论用什么工具启动,都会返回HTML格式的开发者异常页

配置VS运行时返回application/problem+json响应的方案

你可以显式配置异常处理中间件覆盖默认逻辑,修改后的完整示例代码如下:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// 全局异常处理配置,所有环境均返回ProblemDetails格式
app.UseExceptionHandler(handlerApp =>
{
    handlerApp.Run(async context =>
    {
        context.Response.StatusCode = StatusCodes.Status500InternalServerError;
        context.Response.ContentType = "application/problem+json";
        var exceptionFeature = context.Features.Get<IExceptionHandlerPathFeature>();
        if (exceptionFeature?.Error != null)
        {
            await context.Response.WriteAsJsonAsync(new
            {
                Title = "请求处理发生错误",
                Status = StatusCodes.Status500InternalServerError,
                // 开发环境返回完整异常详情,生产环境隐藏敏感信息
                Detail = app.Environment.IsDevelopment() ? exceptionFeature.Error.ToString() : string.Empty
            });
        }
    });
});

app.MapGet("/", () => {
    throw new System.Exception("Hello, World!");
    return new string[] { };
});

app.Run();

如果不需要保留开发环境的异常调试信息,也可以直接修改项目launchSettings.json文件中的ASPNETCORE_ENVIRONMENT值为Production,直接关闭默认的开发者异常页,配合上述异常处理中间件即可返回统一格式的响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:09:00