如何基于Accept Header值在.NET Core API中直接拒绝不支持格式的请求
.NET Core API 前置拦截不支持返回格式请求的内置方案
你遇到的仅配置ReturnHttpNotAcceptable = true后仍会先执行控制器逻辑再返回406的问题,是因为默认的输出格式协商逻辑的执行时机在端点处理完成后、响应输出阶段。ASP.NET Core 本身提供了无需自定义中间件的内置拦截方案,可在端点代码执行前就完成Accept头校验,直接返回406。
实现步骤
- 服务注册阶段完成基础配置,除了开启
ReturnHttpNotAcceptable,还需要注册API Explorer服务(用于支持格式校验的前置过滤器逻辑):
services.AddMvcCore(options => { options.ReturnHttpNotAcceptable = true; // 可选配置:严格匹配Accept头,不启用默认回退格式 options.RespectBrowserAcceptHeader = true; }) // 注册Json/Xml等你需要支持的输出格式化器,示例为Json .AddJsonOptions(opt => { // 自定义序列化配置 }) // 必须添加,否则前置格式校验逻辑不生效 .AddApiExplorer();
- 在控制器或接口方法上添加
[Produces]特性,声明该接口支持的返回格式:
[ApiController] [Route("api/[controller]")] // 声明该控制器下所有接口仅支持返回application/json格式 // 支持多格式时可传入多个参数,比如[Produces("application/json", "application/xml")] [Produces("application/json")] public class DemoController : ControllerBase { [HttpGet] public IActionResult GetData() { // 当请求Accept头不匹配声明的格式时,该方法代码不会执行,直接返回406 return Ok(new { Id = 1, Name = "test" }); } }
最小API适配方案
如果使用.NET 6+的最小API模式,直接在端点定义时链式调用Produces方法即可实现相同效果:
app.MapGet("/api/test", () => Results.Ok(new { Id = 1, Name = "test" })) .Produces<object>("application/json");
内容的提问来源于stack exchange,提问作者lruizd
相关产品推荐
相关产品推荐

