我一周前才注意到这一点。我像这样存储用户当前正在玩的益智游戏(www.wikipediamaze.com)的相关数据:
HttpContext.Current.Session.Add("puzzleInfo",currentPuzzleInfo);
我知道使用"InProc“模式在会话中存储数据是非常不稳定的,并且每当web.config发生变化或任何其他因素(包括回收应用程序池)时都会被重置。
然而,我的数据一次只停留几秒钟(时间是可变的,但从字面上看根本不长),然后消失。我在一个共享的托管环境中,所以我不知道这是否会与此有关。
知道是怎么回事吗?我直接把它作为cookie存储在客户端会不会更好?请帮帮忙。
谢谢!
发布于 2009-08-26 14:54:42
Troubleshooting
每隔几秒钟就丢失一次数据是不寻常的,可能是你的共享主机提供商有问题--听起来像是服务器出于某种原因不断地丢弃会话。您可以显示sessionID (Session.SessionID)并查看它是否发生了变化。
可能存在进程崩溃,这是由服务器上的其他人引起的。这是一篇关于解决这类问题的msdn博客文章(向下滚动大约25% ):http://blogs.msdn.com/webtopics/archive/2009/07/22/in-proc-session-state-management.aspx
在共享主机环境中,这对您没有太大帮助,但您可以将其传递到支持链上。也许他们可以查看事件日志,确定是谁破坏了IIS,并将其解雇。
正如Sean McDonough所说:
...given如果您处于共享主机环境中,则很有可能存在不止一台web服务器托管您的站点。如果多个服务器正在为您的站点提供服务,并且正在使用的负载平衡机制不维护任何类型的会话亲和性,那么您可以简单地跳转到不同的web服务器并开始一个新的会话;毕竟,进程内会话不会跨框跟随您。
态保持的替代方案
无论如何,我总是发现即使在专用服务器上,InProc也是间歇性的不可靠,所以我避免使用它。
谨慎使用cookies -cookie会随着每个请求(图像、脚本等)一起传输,并且应该保持最低限度。你可能会想,“嗯,这个项目不需要伸缩”,但是一旦你做出了项目范围的设计决定,你将使用cookie来保持你的状态,你就是在为众所周知的擦伤而巡航。
我的意思是,您已经脱离了最佳实践,可能会遇到一些糟糕的情况,比如我需要将xml文档持久化一秒钟。在cookie中这不是一个好主意!
如果您无法设置会话状态服务器(顺便说一句,这非常容易),因为您处于共享主机环境中,您可以考虑使用SqlSessionStateStore,它允许您将会话数据存储在SQL Server中。
发布于 2009-08-26 15:43:38
布赖恩的建议非常好,我完全同意他的观点。我还想提供一个额外的可能性。
您对托管应用程序的环境了解得多吗?我要求的原因如下:假设你在一个共享托管环境中,有一个以上的web服务器托管你的网站的可能性是相当大的。如果多个服务器正在为您的站点提供服务,并且正在使用的负载平衡机制不维护任何类型的会话亲和性,那么您可以简单地跳转到不同的web服务器并开始一个新的会话;毕竟,进程内会话不会跨框跟随您。
思考的食粮:-)
https://stackoverflow.com/questions/1335025
复制相似问题