【问题标题】:Problem mapping HttpHandler --> HTTP Error 404 Not Found问题映射 HttpHandler --> HTTP Error 404 Not Found
【发布时间】:2011-02-20 23:19:32
【问题描述】:

我在尝试在 web.config 中映射 HttpHandler 时遇到问题。

这是相关的配置位:

<httpHandlers>
  <add verb="*" path="*.hndlr" type="MyAssembly.MyHandler, MyAssembly" validate="false" />
</httpHandlers>

当我导航到 http://localhost/myApp/whatever.hndlr 时,我收到服务器错误 404(未找到)。

这是我第一次连接 HttpHandler,所以我可能会遗漏一些东西 - 感谢任何帮助!

更新

到目前为止,我设法使用这两个答案让它工作 - 谁能解释它为什么工作得到标记的答案!

这是我的配置(如果两者都没有,则无法使用 - 我在经典模式下运行 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>

【问题讨论】:

  • 进一步更新,如果您使用的是 IIS6,则放入 System.webserver 部分的任何内容都将被忽略,因为这仅在 IIS7 集成管道模式下使用。拥有两者的唯一原因是拥有一个对 IIS7 流水线和 calssic 模式以及 IIS6 有效的 web.config。
  • 对不起,它是 IIS7 - 但这会改变事情吗?如果我删除 system.webserver 部分中的位,它就不起作用(找不到 404)并且出于兼容性原因我们处于经典模式。
  • 如果我在 system.web 中注释掉那个,我会得到“无法执行 URL”——出于某种有趣的原因,它只适用于两者! :)
  • 您的更新是一个救生员...非常感谢!
  • validate 不再允许在 system.webServer 中使用

标签: asp.net configuration httphandler web-config


【解决方案1】:

您使用的是 IIS7,如果是,应用程序池是在经典模式还是流水线模式下运行?如果是流水线模式下的IIS7,那么handler引用需要进入下一节

<system.webServer>
    <handlers>
    </handlers>
<system.webServer>

而不是在下面的部分。

<system.web>
    <httpHandlers>
    </httpHandlers>
</system.web>

【讨论】:

  • 已尝试(必须将 name="MyHandler" 添加到属性中) - 看起来很有希望,但现在出现了不同的错误 --> HTTP 错误 500.21 - 内部服务器错误处理程序“MyHandler”有一个坏模块“ ManagedPipelineHandler”在其模块列表中
  • 回答你的其他问题我在经典模式下运行(不是流水线) - 这解释了为什么我收到上面评论中描述的错误:)
  • 是的,解决方案在两个答案之间有点混合 - 我即将发布解决方案,谁能更好地解释到底发生了什么,就会得到积分! :)
【解决方案2】:

作为那些被这个问题困扰的人的指南,我发现关键属性是..

resourceType="Unspecified"

我最初是按照 Microsoft 的示例进行设置的,他们将其设置为

resourceType="File"

它一直给我 404 错误。我的 HTTPHandler 正在返回图形。

希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    我用的是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>
    

    【讨论】:

      【解决方案4】:

      您的处理程序的扩展名是什么?如果您使用像 .hndlr 这样的自定义扩展,您可能还需要在 IIS 中添加 ScriptMap 并将其指向 ASP.NET 运行时,以便 IIS 可以转发请求到正确的处理器。


      1. 在 IIS7 中转到您的网站
      2. 在 IIS 组下转到 处理程序映射
      3. Actions 下点击 Add Script Map
      4. 将请求路径设置为 *.hndlr
      5. 将路径设置为 ASP.NET 运行时 (%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll) 或您正在运行的任何版本。

      然后在您的 web.config 中,您将需要在相应部分中注册处理程序,如另一个答案中所述。

      【讨论】:

        【解决方案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】:

          以前的答案都不适合我。
          我正在使用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");
          

          我让它忽略了针对我的处理程序的请求。
          希望这对某人有所帮助 - 我正在扯掉我的头发!

          【讨论】:

          • 这救了我的培根。非常感谢。
          【解决方案7】:

          希望我的解决方案对其他人有所帮助。在服务器从 IIS6 迁移到 7.5(两者都集成了 .Net 4.0)时,我有一个 Captcha 控件退出工作。事实证明,从&lt;system.webserver&gt;&lt;handlers&gt; 中的&lt;add&gt; 节点中删除此属性preCondition="integratedMode,runtimeVersionv2.0" 解决了这个问题。

          【讨论】:

            【解决方案8】:

            这似乎是一个边缘案例,但我有一个客户,我们在应用程序中使用的 httpHandler 在他们的任何服务器上都不起作用。处理程序指向一个 .ashx 页面,它是从 JavaScript 调用的。

            处理程序映射出现在 IIS 中,处理程序工厂在那里,但是当浏览器请求与处理程序关联的 ashx 页面时,我会得到 404。经过多次不同的修复尝试,我们最终浏览到服务器上 IIS 中的文件,它特别显示了 404.7 与此消息一起返回。

            •为 Web 服务器配置了请求过滤,并且此请求的文件扩展名被明确拒绝。

            •验证 applicationhost.config 和 web.config 中的 configuration/system.webServer/security/requestFiltering/fileExtensions 设置。

            如果您收到此信息,则在您的应用程序或站点级别为 .ashx 扩展名启用请求过滤。在您的站点和应用程序级别转到 IIS 中的请求筛选选项,并验证扩展程序是否未被阻止。可以通过两种不同的方式配置请求过滤。

            默认值似乎是它仅显式阻止列表中配置的文件扩展名。可以配置的另一种方式是只允许列表中允许的特定配置文件。第二个选项是客户默认配置所有 Windows 服务器的方式,结果表明 .ashx 文件扩展名不在允许的扩展名列表中。

            【讨论】:

              【解决方案9】:

              这是我寻找响应 404 的动词时出现的第一个线程。在我的情况下,解决方案是 VS 的配置

              Tools > Options > Web projects > [x] Use 64 bit version
              

              抱歉,我的 VS 是西班牙语

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-07-17
                • 1970-01-01
                相关资源
                最近更新 更多