Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Конвейер обработки запроса в Web API предполагает несколько этапов. Каждым этапом управляет специальный компонент, который называется
обработчик сообщений или message handler. Все эти компоненты наследуются от абстрактного класса
HttpMessageHandler из пространства имен System.Net.Http
Процесс обработки входящего запроса и генерацию ответа можно представить следующим образом:
Как видно на рисунке, конвейер Web API представляют три компонента, каждый из которых является объектом HttpMessageHandler:
HttpServer: получает от хостирующей среды объект запроса HttpRequestMessage
HttpRoutingDispatcher: устанавливает данные для маршрутизации для текущего запроса
HttpControllerDispatcher: выбирает контроллер и вызывает его метод для обработки запроса и генерации HttpResponseMessage
Во время конфигурационной фазы жизненного цикла приложения класс конфигурации GlobalConfiguration создает объект HttpServer и устанавливает следующий объект MessageHandler, которому HttpServer должен передать данные (по умолчанию это HttpRoutingDispatcher).
Собственно вся задача HttpServer состоит в получении от сервера запроса в виде объекта HttpRequestMessage и передачу его в систему маршрутизации.
HttpRoutingDispatcher управляет системой маршрутизации в Web API. На этапе маршрутизации из запроса извлекаются данные, на основе которых генерируются данные для маршрута. Данные маршрута представляют коллекцию пар "ключ-значение", которые используются для сопоставления с определенным маршрутом, определенным в приложении. Как правило, эти данные включают название контроллера и метода для обработки запроса, а также дополнительные параметры запроса.
При этом система маршрутизации только устанавливает такие данные, как контроллер или метод, но не выбирает и не вызывает их.
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); }
И после этого начинается собственно обработка запроса контроллером.