Обработка запроса контроллером

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 29.10.2015

Рассмотрим вкратце процесс обработки запроса контроллером. При получении данных запроса контроллер ApiController делегирует выбор метода для обработки запроса объекту интерфейса IHttpActionSelector:

public interface IHttpActionSelector 
{
	HttpActionDescriptor SelectAction(HttpControllerContext controllerContext);
	ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor
											controllerDescriptor);
}

Вначале контроллер вызывает метод SelectAction, определенный в интерфейсе IHttpActionSelector. В него в качестве параметра передается контекст контроллера HttpControllerContext, который несет информацию о контроллере, обрабатывающем запрос.

Web API предоставляет встроенную реализацию интерфейса - класс ApiControllerActionSelector, который по умолчанию собственно и управляет выбором метода контроллера. Выбор метода для обработки запроса представляет многоэтапный процесс:

  1. Сначала идет обращение к механизму рефлексии для получения у контроллера всех возможных методов.

  2. Затем у всех методов-кандидатов просматриваются атрибуты маршрутизации (при их наличии). Если будут найдены методы, в атрибутах которых определены маршруты, соответствующие запросу, то все остальные методы отбрасываются.

  3. Далее просматриваются данные маршрута на наличие в них значения для сегмента action (если в маршруте определен такой сегмент). Если такое значение (которое передает имя метода) имеется, выбираются все методы, которые имеют данное имя. Остальные методы отбрасываются.

  4. На следующем этапе проверяется, соответствуют ли методы соглашениям о наименовании Web API RESTful. Например, согласно этим условностям метод, обрабатывающий запрос GET, должно называться или начинаться с "Get", например, "GetBooks". Все методы, которые не соответствуют типу запроса (GET, POST, PUT) и не следуют условностям об наименовании, отбрасываются

  5. Если ни один метод не использует соглашения о наименовании, то ApiControllerActionSelector просматривает наличие у методов атрибутов HttpGet, HttpPost, HttpDelete и HttpPut, которые соответствуют типу запроса.

  6. На финальном этапе отбрасываются все методы, которые не соответствуют маршруту по числу и типу параметров.

И по идее в конце должен остаться только один метод. Если же не остается ни одного или, наоборот, больше одного, то возникает ошибочная ситуация.

Вызов метода

После выбора метода, обслуживающего запрос, системе надо вызвать его для создания ответа клиенту. Ответ клиенту представляет объект HttpResponseMessage. За вызов метода отвечает объект интерфейса IHttpActionInvoker:

public interface IHttpActionInvoker {
	Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext,
							CancellationToken cancellationToken);
}

Интерфейс IHttpActionInvoker определяет метод InvokeActionAsync(), который принимает в качестве параметра объект HttpActionContext.

HttpActionContext содержит информацию о выбранном методе и позволяет вызвать этот метод с помощью своего свойства ActionDescriptor. Это свойство представляет объект HttpActionDescriptor, который с помощью своего метода ExecuteAsync() связывает полученные из запроса данные с параметрами метода и вызывает этот метод, получая финальный результат.

Web API также предоставляет встроенную реализацию для данного интерфейса - класс ApiControllerActionInvoker. В конце обработки запроса данный класс обертывает результат обработки объектом HttpActionDescriptor в HttpResponseMessage.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850