2012-12-25 17 views
0

我宣布附着PostAuthenticateRequest这样一个HttpModule的私人财产:ASP.Net httpmodule私有属性表现为静态?

Private Property roles as New List(Of Integer) 

然后在模块的各种方法,我添加了一个角色的列表是这样的:

roles.Add(AppSettings.AnonymousRoleId) 

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

回答

0

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

+0

哎唷!这伤害...我不会做任何事情与数据库,但我从cookie中读取,并创建一个自定义的IPrincipal极其复杂(与角色,德克斯,路径多应用),所以我想这可能是一个好主意上下文。项目在第一次后跳过整个过程! 所以我想这会发生在所有的httpmodules上,它们在每个请求上都会被触发,即使是静态文件,比如图像,css,js等等也是如此。 即使我把它们放在另一个域名如static.mysite.com? 奇怪的是没有办法排除静态内容触发httpmodules – Manight

0

好吧我做了这方面的一些其他的测试和我遇到一个非常奇怪的行为....

我tryed实现一个标志跳过模块中的处理如果模块具有至少读过一次。我这样做,干脆把国旗中的var 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是静态的(VB共享)财产我在调试时使用的HttpModules的purprose。 现在使用这段代码,调试变量在每个页面上刷新+1(我在Default.aspx后面的代码中使用一个简单的Response.Write(GlobalAppSettings.debug)来检查这个 这是因为在该Application_PostAuthenticateRequest方法我设置HttpContext.Current.Items(“UserCheck”)=“1”

那么,为什么在每一页上刷新GlobalAppSettings.debug变量增量的3或5? 步骤是把我逼疯

0

好吧,我想我找到了所有的东西的答案 对HttpContext.Current.Items(“UserCheck”)的检查不起作用,因为每个请求jpg,css,js会激发它自己的HttpContext,所以没有用这样的全球标志。

经过一番搜索后,我发现了一个更干净和传统的解决方案。 如果你不希望你的模块要在为static内容请求发射(至极包括在你的页面的静态资源),您必须在节中的web配置设置:

<modules runAllManagedModulesForAllRequests="false"> 

你也需要添加到你的模块的属性:precondition =“managedHandler”。例如:

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

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