0

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

Private Property roles as New List(Of Integer)

然后在模块的各种方法中,我以这种方式向 List 添加了一个角色:

roles.Add(AppSettings.AnonymousRoleId)

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

4

3 回答 3

0

PostAuthenticateRequest 事件可能在每页被调用多次。看这里PostAuthenticateRequest 触发几次

于 2012-12-25T12:49:47.907 回答
0

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

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

       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 步递增?快把我逼疯了

于 2012-12-25T19:19:14.687 回答
0

好的,我想我找到了所有问题的答案。对 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 触发。

于 2012-12-25T21:58:23.133 回答