8

在 ASP.NET 中,会话使我们能够在用户浏览 Web 应用程序中的 ASP.NET 页面时为用户存储和检索值。但是,不鼓励使用过多的会话。为什么?使用太多会话有什么缺点?

感谢那些会回答的人。

4

2 回答 2

13

内存和/或性能

如果您在进程中存储会话状态(默认),则所有会话数据都存储在应用程序池的本地内存中。如果您有成千上万的用户,您就会明白为什么这可能是个问题。当开发人员在不再需要会话变量后不删除它们时(这很常见,因为很难控制访问网页的顺序)和/或当用户不删除时,问题会变得更糟显式注销(例如通过关闭浏览器窗口),这会使所有这些内存仍然分配但不再使用。

如果您将会话状态存储在进程外(例如,在 SQL Server 或单独的状态服务器中),所有会话变量最终都会跨越网络。随着您添加更多变量,越来越多的数据必须被拉过来。这最终会降低性能。

并发

如果 Web 应用程序使用会话状态,则必须保护访问会话状态的数据免受竞争条件和其他多线程问题的影响。因此,ASP.NET 自动序列化任何使用会话的请求。如果您同时发送两个请求,ASP 甚至不会在第一个请求完成之前启动第二个请求。这可能会导致使用大量 AJAX 或其他应该是异步的逻辑的应用程序出现意外和糟糕的性能。

基础设施

如果您将本地内存用于会话状态,并且您的 Web 应用程序已进行负载平衡,则负载平衡器必须使用 IP 地址或 cookie 强制执行会话粘性。这限制了负载均衡器处理请求的方式——某个会话的所有请求总是命中同一台服务器——这会降低整体性能并消除冗余。

数据丢失

如果应用程序池回收,则在该应用程序池上运行的所有会话都会丢失会话状态,通常需要用户注销并重新开始。

糟糕的代码设计

会话变量本质上是全局变量。过度使用全局变量往往会导致代码结构马虎。变量的范围应始终尽可能紧密。

于 2013-10-08T02:32:02.503 回答
0

基本上,它会消耗服务器内存。由于会话通常存储在进程中,因此该解决方案无法很好地扩展,因为无法在两个或多个状态服务器之间共享。

于 2013-10-08T02:25:54.183 回答