【问题标题】:HttpModule appears to fire for static pages onlyHttpModule 似乎只针对静态页面触发
【发布时间】:2011-01-26 23:02:10
【问题描述】:

我有一个HttpModule 用于处理在 Visual Studio 开发环境中启动和运行的错误。它运作良好。对于客户来说,有硬的404s 并且没有明显的重定向。 Google Analytics 应该对此非常满意。

Visual Studio 2008中调试,当导航到本地主机时:

[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 文件调用。如果我打开customErrorsOff,我会得到标准的丑陋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 文件。

我必须很接近,但我一直在努力完成剩下的设置。谁能把我推过球门线?

【问题讨论】:

    标签: asp.net httpmodule


    【解决方案1】:

    我敢打赌,在使用集成管道时,您没有在 web.config 中为 IIS 7 正确注册模块。要使 HTTP 模块与 IIS 7 配合得很好,您还需要在 &lt;system.webServer&gt; 部分中注册该模块,如下所示:

    <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>
    

    我认为您有 &lt;httpModules&gt; 部分,但没有 &lt;system.webServer&gt; 部分?

    顺便说一句,您使用的是什么错误日志记录模块?如果您使用的是自己自制的,我可以建议使用ELMAH 吗?它很容易上手,是开源的,并且被广泛使用,所以你可以放心,它已经解决了错误和问题。

    编程愉快!

    【讨论】:

    • 感谢您的建议。除了 'precondition="managedHandler"' 之外,我在 web.config 中有以上所有内容。不幸的是,添加该属性并没有改变行为。
    • 感谢您将我指向 ELMAH。我会调查一下,但我想至少先让它工作。
    【解决方案2】:

    经过一番挣扎,我的结论是,答案是: “您的特定 Web 服务器上现有模块的交互,以及您的 web.config 和 IIS 设置如何支持错误处理,可能会导致不常见的开发人员特定的复杂性。幸运的是,如果您想添加一个 HttpModule 进行错误处理,这个问题的变幻莫测是通过开源工具解决的,比如 ELMAH”。 (我不能保证 ELMAH,但我查看了代码,它似乎需要做的事情比我做的要多得多。)

    但如果你已经走到这一步,你应该知道我要做什么:

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

    由于某种原因,我的模块不会注意到缺少静态页面的请求,即使它正在为静态页面运行。考虑一下我未解决的问题(据推测,ELMAH 确实解决了)。

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

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 2011-09-23
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多