2

我正在使用 Windows/Active Directory 身份验证的 ASP.NET (VB) Web 应用程序

我正在使用一个模块,这样我就可以调用公共子例程和函数以及引用变量,而不必实例化一个新对象来在每个页面上访问它们。

在该模块中,我在整个 Web 应用程序的多个页面中使用了一些公共变量。我最近意识到模块中这些公共变量的值在所有用户之间共享。

目标:我希望这些全局变量的值特定于单个用户,而不是在所有会话之间共享,并且我不想在每个使用该变量的页面上实例化一个新的对象/类。

问题:我不想将值存储在客户端变量中,例如 cookie 或会话。我希望将值存储在服务器上,但特定于每个客户端/用户。

我唯一能想到的就是设置一个全局集合/字典并使用经过身份验证的用户名存储变量,但是我需要有特定的函数来获取和设置值。虽然这会起作用,但它需要更新应用程序中所有页面上对这些变量的所有引用。

问题示例:下面的代码显示了我如何在模块中创建公共变量,以及如何从一个页面设置值并在另一个页面上使用。我想继续以同样的方式使用这个变量并在页面之间共享它的值,但是变量的值不需要在用户之间共享。

-- 模块.VB --

Public Module MyMod  
    Public myVariable as String = ""  
End Module  

-- 主页.VB --

  Partial Class _Default  
        Sub Page_Load() Handles MyBase.Load()  
           myVariable = "HELLO WORLD"  
        End Sub  
    End Class  

-- NEXTPAGE.VB --

  Partial Class _Default  
        Sub Page_Load() Handles MyBase.Load()  
           Response.Write(myVariable)  
        End Sub  
    End Class  

如果我必须使用我的用户 ID 索引集合解决方案,此应用程序中有很多页面需要手动更新,所以我希望有一种方法可以简单地以不同的方式限定这些变量或禁用共享会话之间。提前致谢!

4

2 回答 2

2

您遇到的问题是 Web 编程中非常常见的问题。一个模块的成员是静态的——这意味着在你的应用程序的整个 AppDomain 中有一个它们的实例。每个访问这些的用户都将获得相同的对象 - 您已经了解了这一点。

您的选择正是您所描述的。您可以将模块中的公共变量替换为您编写的 getter 属性以访问字典中的用户特定字段(请在编写此 getter 代码时记住线程安全)。

更简单的解决方案是使用 Session。会话值存储在服务器端并且是用户特定的。客户端发送的唯一内容是会话密钥,如果您使用的是 .Net 身份验证,则可能已经发送。

祝你好运,

于 2012-08-03T20:41:12.180 回答
2

您没有说明这些变量是否需要在页面往返过程中保持不变,或者它们是否只是在每个页面的生命周期中使用。

如果它们没有跨页面持久化,那么最简单的解决方案可能是让所有页面都从基于页面的类继承,然后将值从模块移动到基本页面。这样您就不必更改任何变量引用,只需更改页面继承。

如果您确实想保留这些值,完成上述更改会使其更容易实现。然后,您可以将基本页面上的成员变量转换为属性,并将您的用户特定缓存和获取嵌入到 getter 和 setter 中。

例如,而不是:

Public MyVariable As String = ""

你会有类似的东西:

Public Property MyVariable As String
    Get 
       Return GlobalMyVariableCache(UserNameKey)
    End Get
    Set (Value As String)
       GlobalMyVariableCache(UserNameKey) = Value
    End Set
End Property
于 2012-08-03T20:44:22.600 回答