2011-11-14 65 views
1

看來,當你訪問VB.NET中的My.Settings.Default時,你的線程的CurrentPrincipal發生改變。考慮下面的代碼。VB.NET - 訪問My.MySettings.Default更改Thread.CurrentPrincipal?

  Dim name = "admin" 
      Dim user = Membership.GetUser(name) 
      Dim identity = New GenericIdentity(user.UserName) 
      Dim principal = New RolePrincipal(identity) 

      System.Threading.Thread.CurrentPrincipal = principal 
      Debug.WriteLine(System.Threading.Thread.CurrentPrincipal.Identity.Name) 
      Dim x = My.MySettings.Default 
      Debug.WriteLine(System.Threading.Thread.CurrentPrincipal.Identity.Name) 

這段代碼的輸出是

管理

MYDOMAIN \ MyUserName輸入

這個預期?它記錄在任何地方嗎?我找不到任何參考。

它似乎也只在第一次訪問My.MySettings.Default時這樣做,這意味着解決方法可能是在嘗試設置線程的CurrentPrincipal之前觸摸該屬性對其進行初始化。會有什麼不良的副作用嗎?

回答

1

我認爲,這是因爲使用一個線程安全操作所創建的默認實例:

Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) 

由於默認情況下只創造了第一次訪問MySettings,我認爲最簡單的解決方法是在更改用戶身份之前訪問它一次。