Ядро AspNet Web Api использование ApiControllerAttribute - PullRequest
0 голосов
/ 02 декабря 2018

Когда я создаю новый контроллер в проекте API, он генерирует класс контроллера с атрибутом [ApiController], например:

[ApiController]
public class TestController : ControllerBase
{
 //implementation
}

Я видел несколько проектов webapi, где использование этого атрибутаопущенДокументация Microsoft здесь говорит:

Указывает, что тип и все производные типы используются для обслуживания ответов HTTP API.Наличие этого атрибута может использоваться для нацеливания соглашений, фильтров и других поведений, основанных на назначении контроллера.

Но, тем не менее, я не понимаю эту идею.Может кто-нибудь объяснить, какова цель этого атрибута на примере из реальной жизни?

1 Ответ

0 голосов
/ 02 декабря 2018

Это хорошо объяснено в документации: Аннотация с атрибутом ApiController , который объясняет, что добавление атрибута [ApiController] в контроллер делает следующее:

  1. Автоматические ответы HTTP 400

    Добавляет фильтр действий, который возвращает ответ 400, если ModelState.IsValid равно false.

  2. Вывод параметров источника привязки

    Изменяет соглашения о привязке модели.Например, [FromBody] выводится для параметров сложного типа.

  3. Вывод запроса из нескольких частей / данных формы

    Выводит тип содержимогоmultipart/form-data для параметров, помеченных [FromForm].

  4. Требование маршрутизации атрибута

    Указывает, что все действия должны быть маршрутизированы по атрибуту.

Вы можете увидеть, как это на самом деле делается в источнике :

foreach (var actionModel in controllerModel.Actions)
{
    if (!isApiController && !actionModel.Attributes.OfType<IApiBehaviorMetadata>().Any())
    {
        continue;
    }

    EnsureActionIsAttributeRouted(controllerHasSelectorModel, actionModel);
    AddInvalidModelStateFilter(actionModel);
    InferParameterBindingSources(actionModel);
    InferParameterModelPrefixes(actionModel);
    AddMultipartFormDataConsumesAttribute(actionModel);
}

Если вас не интересуют какие-либо из описанных функцийвыше, вы можете опустить атрибут.Также можно подавить отдельные функции, настроив класс ApiBehaviorOptions.

...