我需要编写一个HttpHandler,它将提供JavaScript文件,这些文件是我项目中.DLL中的嵌入资源。视图中的引用无法直接看到这样的资源,因此我计划使用HttpHandler模块来拦截任何带有路径/ js / [file]的请求,找到匹配的嵌入文件并返回脚本。
问题是我的HttpHandler代码从未被调用过,尽管在web.config部分尝试了很多不同的设置。我显然错过了一些东西,但没有错误信息,我看不出那是什么。我得到的只是来自静态文件处理程序的404。
Q1)我错过了一些明显的东西吗?
Q2)有没有办法让IIS告诉我它为什么不调用我的处理程序?
摘要:我正在IIS Express(v8)上测试ASP.NET MVC 4应用程序。
我创建了一个实现IHttpHandler的简单库,并在我的测试MVC应用程序中添加了对此的引用,以及web.config中的以下行:
<system.webServer>
<validation validateIntegratedModeConfiguration="true" />
<handlers>
<add name="ejs" path="js/*" verb="*" type="EmbeddedJsHandler.EmbeddedJsHandler, EmbeddedJsHandler" preCondition="integratedMode" />
库在那里,但从未调用过。任何使用/js/test.js或其他任何请求都会导致404错误。
到目前为止,我已在处理程序代码中尝试了许多不同的配置和设置。我试过preCondition,resourceType =“Unspecified”,modules =“IsapiModule”scriptProcessor =“%windir%\ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll”
我尝试过路径:
js/*.js js/* js/*.*
我已经检查了正在使用的集成模式设置部分(在system.webServer中),并确认它是。
我搜索了类似情况的堆栈溢出,并尝试了许多可能的解决方案..仍然没有快乐。
甚至Jon Skeet也有这些问题! Why isn't my IHttpHandler being called?
答案 0 :(得分:26)
最后偶然发现它 - 它是RouteConfig.cs文件中的缺少routes.IgnoreRoute() - MVC路由引擎未配置为忽略此路径,因此将其传递给静态文件处理程序。 / p>
卫生署!
答案 1 :(得分:5)
检查一下:
How to: Register HTTP Handlers:
注册在集成模式下运行的IIS 7.0的HTTP处理程序:
编译HTTP处理程序类并将生成的程序集复制到应用程序根文件夹下的Bin文件夹中。
在应用程序的Web.config文件中,在system.webServer部分中创建一个处理程序元素。
以下示例显示如何注册响应SampleHandler.new资源请求的HTTP处理程序。处理程序在程序集SampleHandlerAssembly中定义为类SampleHandler。
<configuration>
<system.webServer>
<handlers>
<add name="SampleHandler" verb="*"
path="SampleHandler.new"
type="SampleHandler, SampleHandlerAssembly"
resourceType="Unspecified" />
</handlers>
</system.webServer>
</configuration>
注意: resourceType 属性执行与IIS 6.0的IIS管理器中的“验证文件存在”选项相同的功能。
对于在集成模式下运行的IIS 7.0,只需要在处理程序元素中进行注册。
答案 2 :(得分:1)
我不能直接告诉你为什么你的处理程序不能正常工作,但我会举一个我们使用并为我们工作的处理程序的例子:
<system.webServer>
<handlers>
<add name="JS handler" path="*.js" verb="*" type="Handlers.Minifiers.JSMinify" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
</system.webServer>
我们也有这个片段,至少在Cassini
中运行是必需的<system.web>
<httpHandlers>
<add verb="*" path="*.js" type="Handlers.Minifiers.JSMinify" validate="false"/>
</httpHandlers>
</system.web>
如果这没有帮助,请尝试使用path="/js/*"
?