HttpModule似乎只针对静态页面触发

时间:2011-01-26 23:02:10

标签: asp.net httpmodule

我有一个HttpModule用于在visual studio开发环境中处理错误。它运作良好。对于客户端,存在严重的404 s并且没有明显的重定向。 Google Analytics应该对此非常满意。

Visual Studio 2008中进行调试,当导航到localhost:

[port]/this_page_doesnt_exist.html, I get a our 404 error page and the hard 404.  

它也适用于

的开发服务器
localhost:[port]/this_page_doesnt_exist.aspx.

当我将它全部移植到我们的IIS7 Web服务器时,我已经完全按照静态HTML文件的方式工作了。但是,我已经确定我的模块根本没有被aspx文件调用。如果我转向customErrors Off,我会看到标准丑陋的404页面。 (如果customErrorsRemoteOnly,则会启用这些内容。)

这些线索似乎指向了一些我没有适当调整的IIS设置,但我不能为我的生活找到它。有任何想法吗?

更多信息:

我正在以集成模式运行,而我的web.config包含以下部分:

<configuration>
    <system.web>
      <httpModules>
        <add name="ErrorModule" type="HttpModules.ErrorModule, HttpModules"/>
      </httpModules>
    </system.web>
    <system.webServer>
      <validation validateIntegratedModeConfiguration="false"/>
      <modules>
        <add name="ErrorModule"  preCondition="managedHandler" type="HttpModules.ErrorModule, HttpModules"/>
      </modules>
    </system.webServer>
</configuration>

更多信息

我认为在IIS7发生的事情并非如此。我在服务器上看到HTML文件的404错误消息的唯一原因是CustomErrorHandler本机模块正在获取它。当我关闭该模块时,我现在让ErrorHandler运行aspx个文件,但不运行HTML文件。

我必须接近,但我一直在努力让我的设置完成剩下的工作。任何人都可以把我推到球门线上吗?

2 个答案:

答案 0 :(得分:1)

我打赌你在使用集成管道时没有在{7}}中为IIS 7正确注册模块。要让HTTP模块在IIS 7中运行良好,您还需要在web.config部分注册该模块,如下所示:

<system.webServer>

我认为你有<configuration> <system.web> <httpModules> <add name="..." type="..." /> </httpModules> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules> <add name="..." type="..." preCondition="managedHandler" /> </modules> </system.webServer> </configuration> 部分而不是<httpModules>部分?

另外,您使用的是什么错误记录模块?如果您使用自己的自制烤面包,我建议您使用ELMAH吗?它很容易上手,是开源的,并且被广泛使用,所以你可以放心,它们可以解决这些错误和问题。

快乐编程!

答案 1 :(得分:0)

经过相当多的努力,我的结论是答案是: “您的特定Web服务器上现有模块的交互,以及您的web.config和IIS设置如何支持错误处理,可能导致不常见的特定于开发人员的复杂情况。值得庆幸的是,如果您想添加HttpModule以进行错误处理,问题的变幻莫测是通过开源工具解决的,例如ELMAH“。 (我不能保证ELMAH,但我看了代码,似乎需要做的比我正在做的更多,以使它工作。)

但如果你走到这一步,你应该知道我的工作:

在IIS管理器中,我修改了模块顺序,以便我的错误处理程序在本机CustomErrorModule之前。 (或者,按照您希望的顺序重新指定站点根目录web.config中的所有模块。)仅在托管代码上运行您的模块。

出于某种原因,我的模块没有注意到丢失静态页面的请求,即使它是针对静态页面运行的。考虑一下我未解决的问题(可能是ELMAH解决了这个问题)。

在IIS管理器中,我将错误页面设置为指向自定义错误页面。这是针对静态页面的。它们是设置Response.StatusCode的aspx文件。瞧!一切的硬错误代码。