为整个类而不是为每个方法设置 HTTP ResponseTypes

Posted

技术标签:

【中文标题】为整个类而不是为每个方法设置 HTTP ResponseTypes【英文标题】:Set HTTP ResponseTypes for whole class instead of for each method 【发布时间】:2022-01-08 22:24:45 【问题描述】:

在 ASP.NET MVC 项目中,我们有几个端点方法,其中为所有方法设置了一些标记,例如 ProducesResponseType((int)HttpStatusCode.OK) 标记。

有没有办法为类中的所有方法设置一些响应?

如您所见,四行代码仅用于状态代码

/// <summary> A summary describing the endpoint</summary>
[HttpPost("RenameSomething/", Name = "Rename[controller]")]
[Produces("application/json")]
[ProducesResponseType((int)HttpStatusCode.OK),
 ProducesResponseType((int)HttpStatusCode.NotFound),
 ProducesResponseType((int)HttpStatusCode.BadRequest),
 ProducesResponseType((int)HttpStatusCode.InternalServerError)]
public ActionResult RenameSomething()

【问题讨论】:

【参考方案1】:

您可以在控制器类上应用此类ProducesResponseType 属性, 因为这个属性既可以应用于方法也可以应用于AttributeUsage指定的类。

[System.AttributeUsage(  
    System.AttributeTargets.Class |  
    System.AttributeTargets.Method,  
    AllowMultiple=true, Inherited=true
    )]
public class ProducesResponseTypeAttribute : Attribute

[ProducesResponseType((int)HttpStatusCode.OK),
    ProducesResponseType((int)HttpStatusCode.NotFound),
    ProducesResponseType((int)HttpStatusCode.BadRequest),
    ProducesResponseType((int)HttpStatusCode.InternalServerError)
    ]
public class MyController : Controller



为了更进一步,您可以联系convention based approach,但这看起来比您要求的要多。

【讨论】:

谢谢,太好了,我已经在实施了。假设方法标记[ProducesResponseType(typeof(IEnumerable&lt;SomethingDto&gt;), (int)HttpStatusCode.OK) 将覆盖类标记[ProducesResponseType((int)HttpStatusCode.OK)] 是否安全? @jonadv 据我所知/记得,类级别的属性与方法级别的属性相加。

以上是关于为整个类而不是为每个方法设置 HTTP ResponseTypes的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 Python Pyramid 视图类而不需要为每个方法指定“名称”

开闭原则是不是意味着我们必须将每个方法都定义为虚拟的?

UIStoryboardSegue - performSegue 方法传递类而不是标识符

我可以为类而不是实例定义 __repr__ 吗? [复制]

如何隐藏整个类而不产生错误

无法将 osgi 服务 bean 公开为类而不是接口