问题映射 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 控件退出工作。事实证明,从<system.webserver><handlers>
中的<add>
节点中删除此属性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的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET路由系统实现原理:HttpHandler的动态映射