Подтвердить что ты не робот

Почему вызов диспетчера 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

4b9b3361

Ответ 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, и есть один новый конвейер.