Конвейер в ASP.NET Web API

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

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

Конвейер обработки запроса в Web API предполагает несколько этапов. Каждым этапом управляет специальный компонент, который называется обработчик сообщений или message handler. Все эти компоненты наследуются от абстрактного класса HttpMessageHandler из пространства имен System.Net.Http

Процесс обработки входящего запроса и генерацию ответа можно представить следующим образом:

Конвейер Web API

Как видно на рисунке, конвейер Web API представляют три компонента, каждый из которых является объектом HttpMessageHandler:

  • HttpServer: получает от хостирующей среды объект запроса HttpRequestMessage

  • HttpRoutingDispatcher: устанавливает данные для маршрутизации для текущего запроса

  • HttpControllerDispatcher: выбирает контроллер и вызывает его метод для обработки запроса и генерации HttpResponseMessage

HttpServer

Во время конфигурационной фазы жизненного цикла приложения класс конфигурации GlobalConfiguration создает объект HttpServer и устанавливает следующий объект MessageHandler, которому HttpServer должен передать данные (по умолчанию это HttpRoutingDispatcher).

Собственно вся задача HttpServer состоит в получении от сервера запроса в виде объекта HttpRequestMessage и передачу его в систему маршрутизации.

HttpRoutingDispatcher

HttpRoutingDispatcher управляет системой маршрутизации в Web API. На этапе маршрутизации из запроса извлекаются данные, на основе которых генерируются данные для маршрута. Данные маршрута представляют коллекцию пар "ключ-значение", которые используются для сопоставления с определенным маршрутом, определенным в приложении. Как правило, эти данные включают название контроллера и метода для обработки запроса, а также дополнительные параметры запроса.

При этом система маршрутизации только устанавливает такие данные, как контроллер или метод, но не выбирает и не вызывает их.

HttpControllerDispatcher

HttpControllerDispatcher получает данные от HttpRoutingDispatcher и на их основании с помощью объекта IHttpControllerSelector выбирает контроллер:

public interface IHttpControllerSelector 
{
	IDictionary<string, HttpControllerDescriptor> GetControllerMapping();
	HttpControllerDescriptor SelectController(HttpRequestMessage request);
}

Метод GetControllerMapping возвращает коллекцию всех контроллеров, которые имеются в приложении. Для выбора контроллеров в приложении метод активирует объект IHttpControllerTypeResolver.

А метод SelectController устанавливает контроллер, который должен обрабатывать запрос. Он возвращает объект HttpControllerDescriptor, содержащий информацию о контроллере.

После этого HttpControllerDispatcher вызывает у полученного объекта HttpControllerDescriptor метод CreateController(), который возвращает объект интерфейса IHttpControllerActivator:

public interface IHttpControllerActivator 
{
	IHttpController Create(HttpRequestMessage request, 
		HttpControllerDescriptor controllerDescriptor, Type controllerType);
}

Метод Create создает уже непосредственно объект контроллера в виде интерфейса IHttpController и передает ему через параметры объект запроса HttpRequestMessage, объект HttpControllerDescriptor, описывающий контроллер и тип контроллера.

Web API предоставляет встроенную реализацию интерфейса IHttpControllerActivator - класс DefaultHttpControllerActivator из пространства имен System.Web.Http.Dispatcher

После создания контроллера происходит вызов метода ExecuteAsync:

public interface IHttpController 
{
	Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext,
			CancellationToken cancellationToken);
}

И после этого начинается собственно обработка запроса контроллером.

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