Отображение проблемы HttpHandler → Ошибка HTTP 404 не найдена
У меня возникают проблемы с попыткой сопоставить HttpHandler в файле web.config.
Это соответствующий бит конфигурации:
<httpHandlers>
<add verb="*" path="*.hndlr" type="MyAssembly.MyHandler, MyAssembly" validate="false" />
</httpHandlers>
Когда я перехожу к http://localhost/myApp/whatever.hndlr
, я получаю ошибку сервера 404 (не найден).
Это первый раз, когда я подключаю HttpHandler, чтобы я мог что-то упустить - любая помощь была оценена!
UPDATE
Мне удалось заставить его работать, используя оба ответа до сих пор - кто может exaplin, почему он работает, получает ответ, отмеченный!
Это моя конфигурация (не будет работать, если у меня нет обоих - я запускаю IIS7 в классическом режиме)
system.web:
<httpHandlers>
<add verb="*" path="*MyHandler.hndlr" type="MyAssembly.MyAssemblyHandler, MyAssembly" validate="false"/>
</httpHandlers>
system.webServer:
<handlers>
<add name="MyHandler" verb="*" path="*MyHandler.hndlr" type="MyAssembly.MyAssemblyHandler, MyAssembly" validate="false" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"/>
</handlers>
Ответы
Ответ 1
Используете ли вы IIS7, если это пул приложений, запущенный в классическом или конвейерном режиме? Если это IIS7 в конвейерном режиме, то ссылка на обработчик должна перейти в следующий раздел
<system.webServer>
<handlers>
</handlers>
<system.webServer>
а не в следующем разделе.
<system.web>
<httpHandlers>
</httpHandlers>
</system.web>
Ответ 2
Как руководство для тех, кто застрял в этой проблеме, я нашел ключевой атрибут...
resourceType="Unspecified"
Я изначально следовал примеру Microsoft, чтобы установить это, и у него было это как
resourceType="File"
который только что дал мне 404 ошибки. Мой HTTPHandler возвращает графику.
Надеюсь, что это поможет:)
Ответ 3
Каково расширение вашего обработчика? Если вы используете настраиваемое расширение типа .hndlr, вам также может потребоваться добавить ScriptMap в IIS и указать его в среду выполнения ASP.NET, чтобы IIS мог перенаправить запрос к правильному процессору.
- В IIS7 перейдите на ваш сайт.
- В группе IIS перейдите в Отображения обработчиков
- В Действия нажмите Добавить Script Карта
- Установить путь запроса к *.hndlr
- Установить путь к среде выполнения ASP.NET(% windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll) или любую другую версию, в которой вы работаете.
Затем в вашем web.config вам нужно будет зарегистрировать обработчик в соответствующем разделе, как описано в другом ответе.
Ответ 4
Я использую IIS7, решение:
в разделе
<system.web>
<httpHandlers>
<add verb="*" path="*.ashx" type="CVOS.MyDocumentHandler"/>
</httpHandlers>
<system.web>
и раздел
<system.webServer>
<handlers>
<add name="pdfHandler" verb="*" path="*.ashx" type="CVOS.MyDocumentHandler" />
</handlers>
</system.webServer>
Ответ 5
Также можно испытать эту ошибку, если вы настроили обработчик для 32 бит, но вы используете 64-разрядный (или наоборот). Легко настроить оба и покрыть все базы.
Обратите внимание на отличия "preCondition" и "scriptProcessor".
<handlers>
<add name="MyHandler_32bit" verb="*" path="*MyHandler.hndlr" preCondition="bitness32" type="MyAssembly.MyAssemblyHandler, MyAssembly" validate="false" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" />
<add name="MyHandler_64bit" verb="*" path="*MyHandler.hndlr" preCondition="bitness64" type="MyAssembly.MyAssemblyHandler, MyAssembly" validate="false" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" />
</handlers>
Ответ 6
Надеюсь, мое решение поможет другим. На сервере перейдите от IIS6 до 7.5, оба .Net 4.0 Integrated, у меня был Captcha-элемент управления, который прекратил работать. Оказывается, удаление этого атрибута preCondition="integratedMode,runtimeVersionv2.0"
из <add>
node в <system.webserver><handlers>
устраняет проблему.
Ответ 7
Ни один из предыдущих ответов не работал у меня.
Я использую IIS 8.5, .Net v4.0, Integrated
и все еще получаю 404 со следующей конфигурацией обработчика:
<system.webServer>
<handlers>
<add name="testEmail" path="*.em" verb="*" type="MyApp.testRazorEmailHandler, MyApp" resourceType="Unspecified" requireAccess="Script" />
</handlers>
</system.webServer>
Я включил отслеживание и нашел следующее:
116. -HANDLER_CHANGED
OldHandlerName testEmail
NewHandlerName System.Web.Mvc.MvcHandler
NewHandlerModules ManagedPipelineHandler
NewHandlerScriptProcessor
NewHandlerType System.Web.Mvc.MvcHandler, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Как вы видите, похоже, что он правильно взял запрос, используя мой пользовательский HttpHandler testEmail
, но MVC украл его.
Я открыл определения маршрутов в RouteConfig.cs
и обнаружил, что добавление:
routes.IgnoreRoute("{resource}.em");
Я получил его, чтобы игнорировать запросы, предназначенные для моего обработчика.
Надеюсь, это помогает кому-то - я рвал волосы!