Что делает ExtensionlessUrlHandler в приложении MVC?
Я пытаюсь оптимизировать мое приложение MVC и удалять как можно больше. Может кто-нибудь объяснить мне, что этот код ниже делает в файле web.config в корне приложения. Я прокомментировал это и все еще сумел запустить приложение...
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit"/>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0"/>
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>
...
Я рассмотрел этот вопрос: ASP.NET MVC 4 и ExtensionlessUrlHandler, у которого есть ответ, который ссылается на этот блог: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx, но я не нахожу, чтобы это объясняло мой вопрос.
Я использую: IIS 8, ASP.NET MVC 4,.NET 4.5 как в разработке, так и в производстве
Ответы
Ответ 1
IIS express использует разные имена обработчиков, чем IIS
Добавьте следующую разметку и отключите обработчики без расширения для IIS express только
<remove name="ExtensionlessUrl-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrl-Integrated-4.0" />
Ответ 2
Вы должны проверить свой файл web.config. Если присутствует следующая настройка
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
Тогда это может объяснить, почему все все еще работает после удаления обработчиков ExtensionlessUrlHandler.
По умолчанию runAllManagedModulesForAllRequests является ложным, что означает, что IIS не делегирует каждый запрос управляемым (.NET) модулям.
Основной модуль, который знает, как обрабатывать расширение с меньшим количеством URL-адресов, называется модулем UrlRouting и является управляемым (не родным) модулем. Это означает, что у него нет возможности обрабатывать запрос, и IIS внутренне пытается обработать его в соответствии с конфигурацией отображения обработчика.
BTW, конфигурация по умолчанию рассматривает URL-адрес без продолжения как статический ресурс и поэтому не с кодом статуса 403.14 (в большинстве случаев)
Когда runAllManagedModulesForAllRequests истинно, любой запрос, отправляемый в IIS, направляется в любой управляемый модуль. Модуль UrlRouting имеет изменения для обработки запроса и делегирования его ASP.NET MVC.
Подводя итог, при запуске приложений ASP.NET MVC у вас есть две опции
- runAllManagedModulesForAllRequests является ложным. Обязательно зарегистрировать ExtensionlessUrlHandler
- runAllManagedModulesForAllRequests - это правда. Вы можете удалить ExtensionlessUrlHandler из списка обработчиков IIS.