12

我需要编写一个 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 也有这些问题! 为什么我的 IHttpHandler 没有被调用?

4

3 回答 3

28

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

嗬!

于 2012-12-20T15:02:45.300 回答
5

检查这个:

如何:注册 HTTP 处理程序

要为在集成模式下运行的 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 元素中进行注册。

于 2012-12-20T10:45:22.643 回答
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/*"

于 2012-12-20T10:30:10.377 回答