1

看来,当您在 VB.NET 中访问 My.Settings.Default 时,您的线程的 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)

这段代码的输出是

行政

我的域\我的用户名

这是预期的吗?它在任何地方都有记录吗?我找不到任何对它的引用。

它似乎也只在第一次访问 My.MySettings.Default 时执行此操作,这意味着解决方法可能是在尝试设置线程的 CurrentPrincipal 之前触摸该属性以对其进行初始化。这样做会有任何不良副作用吗?

4

1 回答 1

1

我相信这是因为默认实例是使用线程安全操作创建的:

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

由于默认实例仅在您第一次访问 MySettings 时创建,我认为最简单的解决方案是在更改用户身份之前访问它一次。

于 2011-11-15T00:41:09.620 回答