【问题标题】:HttpHandler not being called未调用 HttpHandler
【发布时间】:2012-12-07 19:59:17
【问题描述】:

我需要编写一个 HttpHandler 来提供 JavaScript 文件,这些文件是我项目中 .DLL 中的嵌入资源。视图中的引用不能直接看到这样的资源,所以我打算使用一个 HttpHandler 模块来拦截任何带有路径 /js/[file] 的请求,找到匹配的嵌入文件并返回脚本。

问题是我的 HttpHandler 代码从未被调用,尽管在 web.config 部分尝试了许多不同的设置。我显然遗漏了一些东西,但没有错误消息,我看不到那是什么。我得到的只是来自静态文件处理程序的 404。

Q1) 我是否遗漏了一些明显的东西?

Q2) 有没有办法让 IIS 告诉我为什么它没有调用我的处理程序?

总结:我正在为 ASP.NET MVC 4 应用程序在 IIS Express (v8) 上进行测试。

我创建了一个实现 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?

【问题讨论】:

  • 你使用什么版本的 IIS?

标签: asp.net httphandler iis-express


【解决方案1】:

我不能直接告诉你为什么你的处理程序不工作,但我会给你一个我们使用并为我们工作的处理程序的例子:

<system.webServer>
    <handlers>
        <add name="JS handler" path="*.js" verb="*" type="Handlers.Minifiers.JSMinify" resourceType="Unspecified" preCondition="integratedMode" />
    </handlers>
</system.webServer>

我们也有这个段,至少是在卡西尼中运行所必需的

<system.web>
    <httpHandlers>
        <add verb="*" path="*.js" type="Handlers.Minifiers.JSMinify" validate="false"/>
    </httpHandlers>
</system.web>

如果这没有帮助,您是否尝试过使用path="/js/*"?

【讨论】:

  • 现在想通了..这与 web.config 根本无关,这是一个错误配置的 routes.ignore 设置..(请参阅我自己的答案)。不过感谢您的建议!
【解决方案2】:

检查一下:

How to: Register HTTP Handlers:

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

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

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

以下示例显示如何注册响应 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,只需要在 handlers 元素中进行注册。

【讨论】:

  • 感谢您的意见。我已经阅读了那篇文章,并且我的代码已经在一个单独的 DLL 中,所以编译好了。
【解决方案3】:

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

哇!

【讨论】:

  • 我希望看到您为此添加到 RouteConfig.cs 的行。你还有机会吗?
  • 谢谢,这解决了我的问题。 @ToboldHornblower 这是我的 RouteConfig.cs 中的行 - routes.IgnoreRoute("PaymentCallback.ashx");
  • 谢谢!浪费了 4 个该死的小时!!!但最终遇到了您的解决方案。谢谢你100次! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多