2012-12-25 19 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被解僱。