Ответ 1
Наконец, выяснилось это случайно - это были недостающие маршруты. IgnoreRoute() в файле RouteConfig.cs - механизм маршрутизации MVC не был настроен на игнорирование этого пути, поэтому он передавал его в обработчик статического файла.
Doh!
Мне нужно написать HttpHandler, который будет обслуживать файлы JavaScript, которые являются встроенными ресурсами в .LLL в моем проекте. Ссылка в представлении не может непосредственно увидеть такой ресурс, поэтому я планировал использовать модуль HttpHandler, который перехватывал любой запрос с помощью пути /js/ [file], находил соответствующий встроенный файл и возвращал script.
Проблема в том, что мой код HttpHandler никогда не вызывается, несмотря на то, что в разделе web.config выполняется множество разных настроек. Мне явно не хватает чего-то, но без сообщений об ошибках я не вижу, что это такое. Все, что я когда-либо получаю, это 404 из статического обработчика файлов.
Q1) Я пропущу что-то очевидное?
Q2) Есть ли способ заставить IIS сказать мне, почему он не вызывает мой обработчик?
Резюме: Я тестирую IIS Express (v8) для приложения ASP.NET MVC 4.
Я создал простую библиотеку, которая реализует IHttpHandler и добавила ссылку на это в моем тестовом MVC-приложении, и следующие строки в web.config:
<system.webServer>
<validation validateIntegratedModeConfiguration="true" />
<handlers>
<add name="ejs" path="js/*" verb="*" type="EmbeddedJsHandler.EmbeddedJsHandler, EmbeddedJsHandler" preCondition="integratedMode" />
Библиотека есть, но она никогда не вызывается. Любой запрос с /js/test.js или что-то другое приводит к ошибке 404.
До сих пор я пробовал много разных конфигураций и настроек в коде обработчика. Я пробовал preCondition, resourceType = "Unspecified", modules = "IsapiModule" scriptProcessor = "% windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll"
Я пробовал пути:
js/*.js js/* js/*.*
Я проверил раздел настроек интегрированного режима (в файле system.webServer) и подтвердил его.
Я искал переполнение стека для подобных случаев и пытался использовать многие из возможных решений.. до сих пор нет радости.
Черт возьми, даже у Джона Скита есть такие проблемы! Почему мой IHttpHandler не называется?
Наконец, выяснилось это случайно - это были недостающие маршруты. IgnoreRoute() в файле RouteConfig.cs - механизм маршрутизации MVC не был настроен на игнорирование этого пути, поэтому он передавал его в обработчик статического файла.
Doh!
Проверьте это:
Как зарегистрировать обработчики HTTP:
Чтобы зарегистрировать обработчик HTTP для IIS 7.0, работающий в интегрированном режиме:
Скомпилируйте класс обработчика HTTP и скопируйте полученную сборку в папку Bin в корневой папке приложения.
В файле приложения Web.config создайте элемент обработчиков в разделе system.webServer.
В следующем примере показано, как зарегистрировать обработчик HTTP, который отвечает запросам ресурса SampleHandler.new. Обработчик определяется как класс SampleHandler в сборке SampleHandlerAssembly.
<configuration>
<system.webServer>
<handlers>
<add name="SampleHandler" verb="*"
path="SampleHandler.new"
type="SampleHandler, SampleHandlerAssembly"
resourceType="Unspecified" />
</handlers>
</system.webServer>
</configuration>
Примечание. Атрибут resourceType выполняет ту же функцию, что и опция Verify file exists в диспетчере IIS для IIS 6.0.
Для IIS 7.0, работающего в интегрированном режиме, требуется только регистрация в элементе обработчиков.
Я не могу сказать вам, почему ваш обработчик не работает, но я приведу вам пример обработчика, который мы используем и который работает для нас:
<system.webServer>
<handlers>
<add name="JS handler" path="*.js" verb="*" type="Handlers.Minifiers.JSMinify" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
</system.webServer>
Мы также имеем этот сегмент, который, по крайней мере, необходим для работы в Cassini
<system.web>
<httpHandlers>
<add verb="*" path="*.js" type="Handlers.Minifiers.JSMinify" validate="false"/>
</httpHandlers>
</system.web>
Если это не помогает, попробуйте с помощью path="/js/*"
?