HttpHandler没有被调用

时间:2012-12-20 10:12:36

标签: asp.net httphandler iis-express

我需要编写一个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?

3 个答案:

答案 0 :(得分:26)

最后偶然发现它 - 它是RouteConfig.cs文件中的缺少routes.IgnoreRoute() - MVC路由引擎未配置为忽略此路径,因此将其传递给静态文件处理程序。 / p>

卫生署!

答案 1 :(得分:5)

检查一下:

How to: Register HTTP Handlers

注册在集成模式下运行的IIS 7.0的HTTP处理程序:

  1. 编译HTTP处理程序类并将生成的程序集复制到应用程序根文件夹下的Bin文件夹中。

  2. 在应用程序的Web.config文件中,在system.webServer部分中创建一个处理程序元素。

  3. 以下示例显示如何注册响应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/*"