Почему вызов диспетчера MVC ASP.NET не выполняет делегирование?
Ввести вопрос
Недавно я узнал, что вызов ApiController
Action вызовет метод DelegatingHandler
SendAsync
и что вызов vanilla Controller
Action не вызовет его.
Поиск и исследования
Я просмотрел Web Api и узнал, что он включает HttpMessageHandler
, который является родителем класса DelegatingHandler
. Это заставляет меня думать, что обработчики HTTP-сообщений, как правило, выполняются только как часть конвейера веб-API.
Кроме того, Обработчики сообщений Http выполняются до Url Routing, поэтому, вероятно, это не URL-маршрутизация, которая выбирает между конвейером Web API и MVC.
... рассмотрим использование фильтра действий вместо обработчика сообщений [поскольку фильтры] запускается после маршрутизации URI.
Вопрос
- Являются ли
HttpMessageHandlers
частью ASP.NET Web API, но не ASP.NET MVC?
- Что такое эквивалент
HttpMessageHandler
в MVC ( ЭКВИВАЛЕНТ на диаграмме)?
- Что заставляет запрос следовать конвейеру веб-API ( FORK на диаграмме)?
- Запросы веб-API принципиально отличаются от запросов MVC?
Я имею в виду, что это происходит примерно так, но, пожалуйста, поправьте меня.
Request from Client
|
IIS
|
ASP.NET
|
HttpApplication.BeginRequest
|
et cetera
|
HttpApplication.MapRequestHandler - is this what does the routing?
|
FORK
/ \
/ \
/ \
/ \
/ \
**Web API** **MVC**
| |
HttpControllerRouteHandler MvcRouteHandler
| |
HttpControllerHandler |
| |
HttpMessageHandlers EQUIVALENT?
i.e. |
DelegatingHandlers |
incl. |
HttpServer |
CustomHandlers |
HttpRoutingDispatcher |
HttpControllerDispatcher |
Полезные ссылки
Жизненный цикл приложений ASP.NET
Плакат веб-API ASP.NET
Жизненный цикл приложения ASP.NET MVC 5
Ответы
Ответ 1
Почему вызов контроллера не выполняет обработчик делегирования?
Хорошо, потому что они запускают два разных пути выполнения, если маршрут MVC совпадает с ним, тогда выполняется MVCHandler, а обработчик делегирования выполняется только тогда, когда маршрут Api соответствует. Короче говоря, приведенная выше диаграмма не описывает раскол правильно.
Обработчики делегирования запускают ПОСЛЕ маршрутизации и перед выбором действия. Многие люди путаются между ними.
Маршрутизация просто соответствует URL-адресу набору строковых сегментов и создает RouteValues. RouteValues, которые затем используются при выборе действия. Обработчики делегирования выполняются между этими двумя шагами.
В MVC нет эквивалента для делегирования обработчиков, аналогичным образом это написать свой собственный обработчик, но вы попадаете в глубокую воду там, особенно при генерации ссылок.
Еще один простой способ - написать глобальный фильтр, но обратите внимание, что он будет работать только в том случае, если действие было действительно выбрано.
В частности, ответьте по строке
Являются ли HttpMessageHandlers частью веб-API ASP.NET, но не ASP.NET MVC?
Да, это только конструкции WebAPI.
Что такое эквивалент HttpMessageHandler в MVC (EQUIVALENT на диаграмме)?
Ничего не существует, и диаграмма неверна. Ближайшим является RouteHandler
Что заставляет запрос следовать конвейеру Web API (FORK на диаграмме)?
Соответствие маршруту WebAPI
Запросы веб-API принципиально отличаются от запросов MVC?
Нет, их нет, вилка происходит только после маршрутизации.
EDIT (Aug-18-2015): в MVC 6 веб-API был объединен с MVC, и есть один новый конвейер.