【问题标题】:ASP.Net httpmodule private property behaving as static?ASP.Net httpmodule 私有属性表现为静态?
【发布时间】:2012-12-26 05:58:23
【问题描述】:

我以这种方式在附加到 PostAuthenticateRequest 的 httpmodule 中声明了一个私有属性:

Private Property roles as New List(Of Integer)

然后在模块的各种方法中,我以这种方式将角色添加到列表中:

roles.Add(AppSettings.AnonymousRoleId)

但是我遇到了一个奇怪的行为......每次我刷新页面时,角色列表都会变长,总是添加相同的角色,就像在每次页面刷新时记住私有属性角色一样。就像应用程序静态变量一样。 这个属性不应该是模块私有的吗?

【问题讨论】:

    标签: asp.net properties static httpmodule


    【解决方案1】:

    每个页面可以多次调用 PostAuthenticateRequest 事件。 看这里PostAuthenticateRequest fires several times

    【讨论】:

    • 哎哟!这很痛苦......我没有对 DB 做任何事情,但我从 cookie 中读取并创建了一个非常复杂的自定义 IPrincipal(具有角色、任务、路径的多应用程序),所以我想在其中设置一个标志可能是一个好主意context.items 在第一次之后跳过整个过程!所以我猜这发生在所有httpmodules上,它们在每个请求上都会触发,即使是图像、css、js等静态文件?即使我把它们放在另一个域上,比如 static.mysite.com?奇怪的是没有办法从触发 httpmodules 中排除静态内容
    【解决方案2】:

    好的,我对此进行了一些其他测试,但我遇到了一个非常奇怪的行为....

    如果模块至少被读取一次,我尝试实现一个标志来跳过模块中的处理。我这样做只是以这种方式在 HttpContext.Current.Items 中放置一个标志 var:

           Private Sub Application_PostAuthenticateRequest(ByVal source As Object, ByVal e As EventArgs)
            ' A flag to prevent multiple execution on each request for static files like images, css, js
            If HttpContext.Current.Items("UserCheck") Is Nothing AndAlso _
            DirectCast(HttpContext.Current.Items("UserCheck"), String) <> "1" Then
                GlobalAppSettings.debug += 1
    

    GlobalAppSettings.Debug 是我用于调试 httpmodules 目的的静态(vb 共享)属性。 现在有了这段代码,调试变量应该在每次页面刷新时为 +1(我在 Default.aspx 后面的代码中使用简单的 Response.Write(GlobalAppSettings.debug) 进行检查。 这是因为在 Application_PostAuthenticateRequest 方法结束时我设置了 HttpContext.Current.Items("UserCheck") = "1"

    那么为什么在每个页面上刷新 GlobalAppSettings.debug 变量以 3 或 5 的步长递增? 快把我逼疯了

    【讨论】:

      【解决方案3】:

      好吧,我想我找到了所有问题的答案。 对 HttpContext.Current.Items("UserCheck") 的检查不起作用,因为对 jpg、css、js 的每个请求都会触发它自己的 HttpContext,因此这种方式没有使用全局标志。

      经过一番搜索,我找到了一个更干净、更传统的解决方案。 如果您不希望您的模块在 stati 内容请求时触发(其中包括页面中的静态资源),您必须在以下部分的 web 配置中进行设置:

          <modules runAllManagedModulesForAllRequests="false">
      

      您还必须向您的模块添加属性:precondition="managedHandler"。示例:

          <add name="ReadUserSettings" type="namespace.to.type" preCondition="managedHandler" />
      

      由于某种原因,我的 web.config 中没有这些设置。 现在我遇到了另一个小问题,但现在我对发生的事情有了更好的了解,我想我应该就这个主题打开一个更具体的话题,那就是如何排除 .axd 处理程序(或只是 WebResources.axd 处理程序会做)从触发我的自定义模块,因为 .axd 处理程序受到威胁具有托管代码,因为它具有 preCondition="integratedMode,runtimeVersionv4.0" ,这就是它应该的样子。我只是不希望我的模块被它或其他 .axd 触发。

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多