如何重写控制器的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
相关产品推荐
相关产品推荐

