Установите типы ответов HTTP для всего класса, а не для каждого метода

#c# #asp.net-mvc #api #swagger

#c# #asp.net-mvc #API #развязность

Вопрос:

В 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 атрибут к своему классу контроллера, поскольку этот атрибут может быть применен как к методу, так и к классу, как указано в its 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
{
}
 

Чтобы сделать это еще дальше, вы можете использовать подход, основанный на соглашениях, но это выглядит как нечто большее, чем вы просите.

Комментарии:

1. Спасибо, это здорово, я уже внедряю. Можно ли с уверенностью предположить, что тег метода [ProducesResponseType(typeof(IEnumerable<SomethingDto>), (int)HttpStatusCode.OK) переопределит тег класса [ProducesResponseType((int)HttpStatusCode.OK)] ?

2. @jonadv Насколько я знаю / помню, атрибуты на уровне класса суммируются с атрибутами на уровне метода.