问题映射 HttpHandler --> HTTP Error 404 Not Found

Posted

技术标签:

【中文标题】问题映射 HttpHandler --> HTTP Error 404 Not Found【英文标题】:Problem mapping 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 中使用 【参考方案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 可以转发请求到正确的处理器。


    在 IIS7 中转到您的网站 在 IIS 组下转到 处理程序映射Actions 下点击 Add Script Map 将请求路径设置为 *.hndlr 将路径设置为 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 是西班牙语

【讨论】:

以上是关于问题映射 HttpHandler --> HTTP Error 404 Not Found的主要内容,如果未能解决你的问题,请参考以下文章

注册URL模式与HttpHandler的映射关系

ASP.NET路由系统实现原理:HttpHandler的动态映射

使用默认命名空间的 HttpHandler

无法在带有 httpHandler 的页面上显示 .swf 文件

基于HttpHandler对象实现网页防盗链功能

基于HttpHandler对象实现网页防盗链功能