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

如何重写控制器的ProducesAttribute,使接口仅显示指定响应媒体类型?

解决方案:覆盖控制器继承的ProducesAttribute并仅显示指定媒体类型

可以实现方法级覆盖控制器继承的ProducesAttribute,默认情况下控制器和方法的媒体类型配置会叠加,所以Swagger会显示两种选项。要让方法的配置完全替换控制器的,只需在方法的Produces特性中添加OverrideExistingMediaTypes = true参数即可。

修改后的代码示例

[Produces(MediaTypeNames.Application.Json)]
public class IdentityController : ControllerBase
{
    [HttpGet]
    // 添加OverrideExistingMediaTypes=true,替换控制器的媒体类型配置
    [Produces(MediaTypeNames.Application.Pdf, OverrideExistingMediaTypes = true)]
    public async Task<ActionResult<bool>> Get()
    {
        return true;
    }
}

全局基类配置方案

如果要让大部分接口默认返回application/json,只需把Produces特性放到自定义基类中,需要返回PDF的接口再单独配置覆盖:

// 全局基类统一配置默认媒体类型
[Produces(MediaTypeNames.Application.Json)]
public class CustomBaseController : ControllerBase
{
    // 基类公共逻辑
}

// 业务控制器继承基类
public class IdentityController : CustomBaseController
{
    [HttpGet]
    [Produces(MediaTypeNames.Application.Pdf, OverrideExistingMediaTypes = true)]
    public async Task<ActionResult<bool>> Get()
    {
        return true;
    }
}

原理说明

ASP.NET Core 5.0及以上版本中,ProducesAttribute新增了OverrideExistingMediaTypes属性:

  • 当设为true时,方法级的媒体类型配置会完全替换控制器(或全局)层面的配置
  • 默认值为false,此时会合并所有层级的媒体类型配置,这就是你之前看到Swagger显示两种选项的原因

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:54:57