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

如何基于Accept Header值在.NET Core API中直接拒绝不支持格式的请求

.NET Core API 前置拦截不支持返回格式请求的内置方案

你遇到的仅配置ReturnHttpNotAcceptable = true后仍会先执行控制器逻辑再返回406的问题,是因为默认的输出格式协商逻辑的执行时机在端点处理完成后、响应输出阶段。ASP.NET Core 本身提供了无需自定义中间件的内置拦截方案,可在端点代码执行前就完成Accept头校验,直接返回406。

实现步骤

  1. 服务注册阶段完成基础配置,除了开启ReturnHttpNotAcceptable,还需要注册API Explorer服务(用于支持格式校验的前置过滤器逻辑):
services.AddMvcCore(options =>
{
    options.ReturnHttpNotAcceptable = true;
    // 可选配置:严格匹配Accept头,不启用默认回退格式
    options.RespectBrowserAcceptHeader = true;
})
// 注册Json/Xml等你需要支持的输出格式化器,示例为Json
.AddJsonOptions(opt => {
    // 自定义序列化配置
})
// 必须添加,否则前置格式校验逻辑不生效
.AddApiExplorer();
  1. 在控制器或接口方法上添加[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:09:01