SESSION VARIABLES 的替代方案是什么?

7

在开发大型 Web 应用程序时,Session 变量的限制是什么?此外,有哪些最佳的替代 Session 变量

请为我提供Session 变量的替代方案


https://dev59.com/Y3RA5IYBdhLWcg3w2x6W#799209 - user1193035
4个回答

20
为了理解不使用会话的优势,您需要了解会话的工作原理。
在默认设置中:
- 会话由在用户浏览器中设置的cookie标识。 - 会话数据存储在Web服务器的内存中。
当用户向服务器发送请求时,会话cookie随同发送。它包含标识符,服务器使用该标识符定位特定用户的会话数据。
您可以配置ASP.NET来:
- 使用查询参数而不是cookie来存储会话标识符。 - 将会话数据存储在数据库中(如果您有多个服务器为站点提供服务,则拥有一个中央数据存储会话数据的地方尤为重要)。
现在让我们看看禁用会话状态的优点:
  1. ASP.NET通过序列化请求使访问会话数据线程安全。这意味着,启用会话状态时,ASP.NET拒绝为同一用户提供并发请求。当用户的浏览器进行大量ajax请求时,这特别是一个问题。可以通过标记会话状态为只读来缓解此问题,在不需要更新会话状态的请求中。
  2. 请求进来时,ASP.NET必须获取会话数据,并在请求结束时写入数据。如果会话状态存储在内存中,则这可能不是一个大问题,但如果数据存储在中央数据库中,则可能导致严重的性能问题。

不言而喻,对于存储大量数据的大量用户,这些问题将加剧。

更多信息请参见:

  1. ASP.NET会话状态概述
  2. 快速、可扩展和安全的Web应用程序会话状态管理

(最后一篇文章有些过时,但仍然值得一读)。

替代方案

  • 如果可能的话,尽量避免使用会话状态。
  • 如果你确实需要将数据与用户关联起来,请使用HTTP的机制,并让浏览器在cookie或查询参数中携带数据(这也是整个REST运动的部分内容)。

希望这能有所帮助。


MSDN Magazine的链接指向2005年9月份的问题已经失效。这里是archive.org的版本,同时他们提供了完整的2005年9月份CHM下载,其中包括您的文章。 - Uwe Keim

2
在某些情况下,它取决于您的应用程序业务逻辑,会话可能是最好的选择,但有很多替代方案。如果对于每个请求到您的应用程序都有不同的数据,那么应该使用会话。你可以在表单中通过隐藏字段发布你的数据,但是你的问题有点偏离主题,你必须分析你的需求,然后基于它来决定是否使用会话或其他替代方案。如果我要存储用户ID,那么肯定会使用会话,因为对于每个用户,ID都是不同的。我不会将非常大的数据保留在会话中,例如将数据集保留在会话中,一些开发人员可能这样做。同时,还需要考虑如果您在使用会话时想将其保存在进程中还是服务器中,如果将会话保存在服务器中,这将非常昂贵,但在某些情况下它非常有用。

1

你链接的那篇文章(Saritha 显然是从中复制的)非常古老,谈论的是经典 ASP。但大部分仍然适用。 - Hans Kesting

0

由于会话状态中的数据存储在服务器内存中,因此在处理大量数据时不建议使用会话状态。会话状态变量会一直保留在内存中,直到您销毁它,因此内存中太多变量会影响性能。

会话变量和Cookie是同义词。因此,如果用户设置了浏览器不接受任何Cookie,则您的会话变量将无法为该特定网络浏览器工作!

每个会话变量的实例在用户访问页面时创建,并且这些变量在用户离开页面后持续20分钟!(实际上,这些变量会持续到它们“超时”。此超时长度由Web服务器管理员设置。我见过一些网站,变量会在短短3分钟内崩溃,而其他网站则持续10分钟,还有一些持续默认的20分钟。)因此,如果您将任何大型对象放入会话中(例如ADO记录集、连接等),那么您就会遇到严重的问题!随着访问者数量的增加,将大型对象放入会话中会导致服务器经历严重的性能问题!


1
@saratha 你是在4分钟内打出了所有的单词吗????这太神奇了:: 哈哈 :p - user1193035
2
@saritha,它的替代方案(会话变量)怎么样? - Bhupendra Shukla
2
会话变量和Cookie并不是同义词。您的会话是由Cookie标识的,因此启用Cookie以进行默认会话实现是正确的,但您可以进行无Cookie的会话。事实上,Cookie是会话变量的替代方案。虽然是一个非常糟糕的替代方案,但仍然是一种替代方案。 - Josh Anderson
如果您需要在页面中传递/存储数据,也可以使用ViewState。 - Saritha.S.R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接