ASP.NET存储全局变量 - 可从每个页面访问

时间:2009-04-02 16:19:24

标签: asp.net-3.5

我正在构建一个大型应用程序,我通常使用一个简单的会话来存储私有全局信息,但是由于应用程序可能相当大,我相信这可能是一个问题,因为它可能有大量的内存会话。

有没有更好的方法来存储这些变量?

例如,当用户登录时,我想存储有关该用户的数据并在需要的地方显示,而不必每次都查询数据库。

7 个答案:

答案 0 :(得分:3)

使用cookies - 无论您的负载平衡环境如何,它们都能正常工作

其他选项包括:

1)将您的会话值写入sql数据库 - 您可以配置您的asp.net应用程序以配置会话状态以使用sql server - 但这有其自身的问题,因为会话永远不会超时(所以你需要通过代码处理这个明确地)

2)如果不使用sql server - 基本上当你有太多用户并且在web服务器上实现负载平衡时你会遇到问题 - 所以用户可以在同一个会话中转到不同的Web服务器(并且它不会起作用)

还有一个解决方法 - 它称为STICKY SESSIONS - 您的Web服务器保证您的用户始终在会话中访问同一个Web服务器

3)使用.net 2.0提供程序模型,您甚至可以通过实现其委托来编写自己的会话存储提供程序 - 这样您就可以在Web服务器/共享服务器上创建自己的xml文件,以在那里读取/写入会话数据: - )

所以有很多方法可以解决这个问题。然而,最简单和最具成本效益的解决方案是使用cookies

答案 1 :(得分:3)

会话是进入此处的方式,它们旨在跨请求保留有关当前会话的信息。 ASP.NET框架中没有其他对象具有此意图。

您可以使用缓存,或存储在Application集合中,但是唯一标识单个会话数据的责任取决于您。

您还可以在会话终止时进行处理,并释放存储在这些集合中的实例(缓存或应用程序)。

根据你可能会“思考”的内容,开始提出这些问题真是个坏主意。这是一种过早优化的形式,你应该避免它。相反,使用Sessions,就像它们用于此目的一样,然后测量瓶颈在哪里并解决它们,如果性能在测试时成为问题。

答案 2 :(得分:1)

您可以使用缓存。这内置机制可以在内存耗尽时释放...

答案 3 :(得分:1)

绝对使用cookies。最好的方法是让自己成为一个cookie包装器类,它将为你做所有繁重的工作 - 检查cookie是否为null,访问httpcontext等。不需要弄乱你的所有代码;将它全部抽象为cookies.cs或.vb。

SetCookieValue(someValue, cookieName); //there will be some expiration concerns here as well

myValue = GetCookieValue(cookieName);

Christian Weiss has a good strategy

答案 4 :(得分:0)

如果您认为您的数据对于Session太大,我会考虑使用缓存的某种数据库,这样您就不会进行不必要的调用。

答案 5 :(得分:0)

如果是您正在存储的每用户会话数据,那么使用ASP.NET Session绝对是您最好的选择。如果您最担心内存使用情况,那么您可以使用MSSQL模式。数据必须存在于某个地方,并且选择使用哪种会话模式取决于您的环境和用户的使用模式。

答案 6 :(得分:0)

在您看到这样的问题并尝试解决之前,不要假设会话状态的大小会有问题。例如,虽然整个应用程序可能会使用大量的会话状态,但是任何给定的用户在会话过程中可能不会使用那么多。

我也有可能从默认会话状态提供程序更改为SQL提供程序或状态服务器提供程序可以缓解内存问题。

您可以使用缓存,但缓存是应用程序范围的。您需要使用用户ID或会话ID限定缓存条目:Cache[userID + ".MyCacheEntry"]

在任何情况下,都不要使用静态变量来存储此数据。根据您的主题提示,它们是应用程序范围的,而非每个用户。