验证用户之间的ASP.NET 2会话状态

时间:2010-08-24 21:29:08

标签: asp.net web-applications session-state

我正在为客户开发一个网站(ASP.NET,T-SQL)。它是一个数据输入网站,允许他们的许多用户登录和操作同一数据库中的记录。

整个表单中都有说明(基本上是字符串列表),告诉用户每个部分要做什么;这些说明本身就存在于数据库中。

在每次登录时,我将这些指令存储在每个经过身份验证的用户的Session []对象中。每个人的说明都是相同的。

我已经查看了一个解决方案,该解决方案建议在数据库中存储一个公共会话标识符,然后查询它以重新使用该特定会话,但这似乎非常hacky。什么是实现这一目标的最佳实践解决方案?是否有可供所有用户使用的“通用”对象?

3 个答案:

答案 0 :(得分:4)

首先,此时此重要吗?是的,这是不好的做法,但是如果你在内存中存储20Kb的字符串并且最多有100个用户,那就是2,000Kb的数据。几乎没有很多记忆“浪费”。即使是200Kb的字符串,也就是20,000Kb的数据。再一次,不是很多。你现在值得花时间和客户等你解决吗?

如果您决定,那么您可以:

  1. 将字符串存储在Application对象或静态类中,以便它们被检索一次并多次使用。
  2. 在每个页面视图上检索字符串。这可能不像看起来那样具有破坏性能。
  3. 使用类似System.Web.Caching中的Cache class
  4. 使用Output Caching
  5. 使用Windows Server AppFabric "Velocity" memory cache

答案 1 :(得分:2)

听起来像你正在寻找应用程序缓存。与会话一样,它是内存中的数据缓存。与会话不同,它在所有用户之间共享;每个用户都没有获得他们自己的数据副本。此外,当您向缓存添加数据元素时,您可以指定自动使该数据无效的条件,并使其重新加载/刷新(当您的很少更改的数据确实发生更改时非常有用)。

这里有一些文章可以为您提供有关使用应用程序缓存(以及ASP.NET中的一些其他缓存选项)所需的一切信息:

答案 2 :(得分:1)

我建议使用应用程序级别的Cache对象。它随处可见,作为HttpContext的一部分。您可以在App_Start上填充它。

您可以将任何类型的对象放入缓存中,但显然,越小越好。

以下是如何使用C#填充它的一些示例:

1)将项目添加到缓存中,就像通过指定项目的键和放置项目一样将项目添加到字典中。值。 示例:将文本框的当前Value属性添加到缓存中。

Cache["txt1"] = txtName.value;

Cache["result"] = dataset;

2)Insert方法重载,允许您为正在使用的版本的参数定义值。 示例:仅添加项目键和&值:

Cache.Insert(“MyData1”,connectionString);

3)Add方法与Insert方法具有相同的签名,但它返回一个表示您添加的项目的对象。

Cache.Add("MyData1", connectionString);

要检索来自缓存:

stringName = Cache["MyData"];

如果缓存的数据不是字符串,则可能需要将其强制转换为正确的数据类型。

result = (DataSet)Cache["result"];

使用Cache对象而不是Application对象的一个​​好处是,如果系统存在内存不足的危险,CLR将转储Cache的内容。