HttpHandler не называется

Мне нужно написать 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 не называется?

Ответ 1

Наконец, выяснилось это случайно - это были недостающие маршруты. IgnoreRoute() в файле RouteConfig.cs - механизм маршрутизации MVC не был настроен на игнорирование этого пути, поэтому он передавал его в обработчик статического файла.

Doh!

Ответ 2

Проверьте это:

Как зарегистрировать обработчики 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, работающего в интегрированном режиме, требуется только регистрация в элементе обработчиков.

Ответ 3

Я не могу сказать вам, почему ваш обработчик не работает, но я приведу вам пример обработчика, который мы используем и который работает для нас:

<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/*"?