.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
相关产品推荐
相关产品推荐

