Почему ASP.NET Routing имеет приоритет над разделом Обработчики http.config Http? - PullRequest
9 голосов
/ 23 ноября 2010

Наш магазин интегрирует ASP.NET MVC в большое веб-приложение, которое использует пользовательские и сторонние обработчики HTTP, определенные в web.config в system.webServer \ handlers .Использование HTTP-обработчиков таким образом было для нас очень полезно, потому что нам не нужно перекомпилировать приложение или иметь фактическую страницу обработчика, расположенную на диске где-то в веб-области видимости для каждого экземпляра продукта.

Является ли этодействительно необходимо добавить явные игнорируемые маршруты в наш global.asax, чтобы среда выполнения могла соблюдать наши обработчики, определенные в web.config?Я бы подумал, что Web.Routing будет вызван после обработчики, определенные в system.webServer \ handlers, были проверены (не наоборот).

Мы используем модульную конструкцию, которая позволяетдобавление / удаление обработчиков из web.config при добавлении функций.С введением маршрутизации MVC кажется, что нам нужно добавить маршруты игнорирования в файле global.asax для каждого возможного обработчика, определенного в web.config.

Обратите внимание, что фактический файл для этих обработчиков не существует на диске -они являются виртуальными и встроены в сборку.Вот пример стороннего обработчика, который теперь требует явного Ignore Route в global.asax:

<system.webServer>
    <handlers>
          <!-- telerik radcontrols -->
          <add name="TelerikDialogHandler" verb="*" path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler, Telerik.Web.UI, Version=2009.1.402.20, Culture=neutral, PublicKeyToken=121fae78165ba3d4"></add>
    </handlers>
</system.webServer>

Так что для записи, если вы используете System.Web.Routing, вы должны включить Ignore Routes для указанных обработчиков Httpв Web.Config?А может я что-то не так делаю?

1 Ответ

2 голосов
/ 17 января 2011

Обработка запросов ASP.NET основана на модели конвейера, в которой ASP.NET передает запросы http всем модулям конвейера.Каждый модуль получает запрос http и имеет полный контроль над ним.Как только запрос проходит через все модули HTTP, он в конечном итоге обрабатывается обработчиком HTTP.Обработчик HTTP выполняет некоторую обработку над ним, и результат снова проходит через модули HTTP в конвейере.

Я думаю, что лучший способ думать об этом - это то, что HttpModule - это фильтр, который добавляет или вычитает что-то изобъект запроса, когда происходит событие, и HttpHandler является процессором, который фактически обслуживает запрос.Жизненный цикл запроса ASP.NET настроен таким образом, что все фильтры применяются к запросу в первую очередь до того, как обрабатывается .

...