解决方法
记忆和/或表现
如果存储会话状态进程(默认值),则所有会话数据都存储在应用程序池的本地内存中.如果您有数千名用户,您可以看到为什么这可能是一个问题.当开发人员不再需要删除会话变量时,问题会变得更糟(由于很难控制访问网页的顺序)和/或用户不这样做显式注销(例如,通过关闭浏览器窗口),这使得所有这些内存仍然分配但不再使用.
如果将会话状态存储在进程外(例如,在sql Server或单独的状态服务器中),则所有会话变量最终都会越过网络.随着您添加更多变量,越来越多的数据必须被拉过来.这最终可能会降低性能.
并发
如果Web应用程序使用会话状态,则必须保护访问会话状态的数据免受竞争条件和其他多线程问题的影响.因此,ASP.NET会自动序列化任何使用会话的请求.如果您同时发送两个请求,ASP甚至不会在第二个请求启动,直到第一个请求完成.这可能会导致使用大量AJAX或其他应该是异步的逻辑的应用程序出现意外和性能不佳的情况.
基础设施
如果您使用本地内存进行会话状态,并且您的Web应用程序是负载平衡的,则负载均衡器必须使用IP地址或cookie强制执行会话粘性.这会以负责处理请求的方式限制负载均衡器 – 特定会话的所有请求始终命中同一服务器 – 这会降低整体性能并消除冗余.
数据丢失
如果应用程序池循环使用,则该应用程序池上运行的所有会话都将失去会话状态,通常需要用户注销并重新开始.
代码设计不佳