我在这样附加到PostAuthenticateRequest的httpmodule中声明了一个私有财产:
Private Property roles as New List(Of Integer)
然后在模块的各种方法中,我以这种方式向List添加了一个角色:
roles.Add(AppSettings.AnonymousRoleId)
但是我遇到了一个奇怪的行为......每次刷新页面时,角色列表变得更长,总是添加相同的角色,就像在每次页面刷新时记住私有属性角色一样。就像应用程序静态变量一样。 该属性不应该是模块的私有属性吗?
答案 0 :(得分:0)
每页可多次调用PostAuthenticateRequest事件。 看这里PostAuthenticateRequest fires several times
答案 1 :(得分:0)
好的,我做了一些其他的测试,我遇到了一个非常奇怪的行为......
如果模块已被读取至少一次,我尝试实现一个标志来跳过模块中的处理。我这样做只需在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是一个静态(vb共享)属性,用于调试httpmodules的purprose。 现在有了这个代码,调试变量在每次页面刷新时都是+1(我在Default.aspx后面的代码中用一个简单的Response.Write(GlobalAppSettings.debug)来检查它。 这是因为在Application_PostAuthenticateRequest方法结束时我设置了HttpContext.Current.Items(“UserCheck”)=“1”
那么为什么在每个页面刷新GlobalAppSettings.debug变量以3或5的步长递增? 让我发疯了
答案 2 :(得分: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处理程序是threated具有托管代码,因为它有preCondition =“integratedMode,runtimeVersionv4.0”,这就是它应该如何。我只是不希望我的模块被它或其他.axd。
触发