我在尝试在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>
答案 0 :(得分:28)
您使用的是IIS7,如果是经典模式还是流水线模式运行的应用程序池?如果它是流水线模式的IIS7,则处理程序引用需要进入以下部分
<system.webServer>
<handlers>
</handlers>
<system.webServer>
而不是在以下部分。
<system.web>
<httpHandlers>
</httpHandlers>
</system.web>
答案 1 :(得分:9)
正如那些坚持这个问题的人的指南一样,我发现了关键属性......
resourceType="Unspecified"
我最初跟着一个微软的例子进行了设置,他们把它作为
resourceType="File"
刚刚给我404错误。我的HTTPHandler正在返回图形。
希望这会有所帮助:)
答案 2 :(得分:5)
我正在使用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>
答案 3 :(得分:4)
处理程序的扩展名是什么?如果您使用的是 .hndlr 等自定义扩展程序,则可能还需要在IIS中添加 ScriptMap 并将其指向ASP.NET运行时,以便IIS可以转发请求到正确的处理器。
然后在你的web.config中,你需要在相应的部分注册处理程序,如另一个答案所述。
答案 4 :(得分:2)
如果您设置了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>
答案 5 :(得分:1)
以前的答案都不适合我
我使用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");
我让它忽略了对我的处理程序的请求。
希望这有助于某人 - 我正在撕扯我的头发!
答案 6 :(得分:1)
这似乎是一个极端情况,但我有一个客户,我们的应用程序中使用的 httpHandler 在他们的任何服务器上都不起作用。处理程序指向一个 .ashx 页面,它是从 JavaScript 调用的。
处理程序映射显示在 IIS 中,处理程序工厂在那里,但是当浏览器请求与处理程序关联的 ashx 页面时,我会得到 404。经过多次不同的修复尝试,我们终于在服务器上的 IIS 中浏览了该文件,它特别显示了 404.7 与此消息一起返回。
•为 Web 服务器配置了请求过滤,并明确拒绝了此请求的文件扩展名。
•验证 applicationhost.config 和 web.config 中的配置/system.webServer/security/requestFiltering/fileExtensions 设置。
如果您收到此消息,则在您的应用或站点级别为 .ashx 扩展启用了请求过滤。在您的站点和应用程序级别转到 IIS 中的“请求过滤”选项,并验证扩展是否未被阻止。有两种不同的方式可以配置请求过滤。
默认似乎是它只明确阻止列表中配置的文件扩展名。可以配置的另一种方式是仅允许在列表中明确配置为允许的文件通过。第二个选项是客户在默认情况下如何配置其所有 Windows 服务器,结果证明 .ashx 文件扩展名不在允许的扩展名列表中。
答案 7 :(得分:0)
希望我的解决方案能够帮助他人。在服务器上从IIS6移动到7.5,两者都是.Net 4.0集成,我有一个停止工作的Captcha控件。事实证明,从preCondition="integratedMode,runtimeVersionv2.0"
中的<add>
节点中删除此属性<system.webserver><handlers>
解决了这个问题。