Asp.net InProc会话数据消除

Asp.net InProc会话数据消除,asp.net,session-state,Asp.net,Session State,我一周前才注意到这一点。我正在存储用户正在玩的当前拼图(www.wikipediamaze.com)的数据,如下所示: HttpContext.Current.Session.Add(“拼图信息”,Current拼图信息) 我知道,使用“InProc”模式在会话中存储数据是非常不稳定的,每当web.config更改或任何其他因素(包括回收应用程序池)时,都会重置数据 然而,我的数据一次只停留几秒钟(时间是可变的,但实际上并不长),然后就消失了。我在一个共享托管环境中,所以我不知道这是否与此有关

我一周前才注意到这一点。我正在存储用户正在玩的当前拼图(www.wikipediamaze.com)的数据,如下所示:

HttpContext.Current.Session.Add(“拼图信息”,Current拼图信息)

我知道,使用“InProc”模式在会话中存储数据是非常不稳定的,每当web.config更改或任何其他因素(包括回收应用程序池)时,都会重置数据

然而,我的数据一次只停留几秒钟(时间是可变的,但实际上并不长),然后就消失了。我在一个共享托管环境中,所以我不知道这是否与此有关

知道发生了什么吗?直接将其作为cookie存储在客户机上会更好吗?请帮忙


谢谢

故障排除

每隔几秒钟丢失一次数据是不寻常的,您的共享主机提供商可能有问题——听起来服务器出于某种原因不断地丢弃会话。您可以显示sessionID(Session.sessionID)并查看它是否更改

服务器上的其他人可能导致进程崩溃。下面是一篇msdn博客文章,介绍如何解决此类问题(向下滚动25%左右):

在共享托管环境中,这对您没有多大帮助,但您可以在支持链中放弃它。也许他们可以查看事件日志,确定谁在破坏IIS,并引导他们

正如肖恩·麦克唐纳所说:

…考虑到你在一个共享主机中 环境,这是一个不错的机会 存在多个web服务器 托管您的站点。如果有多个服务器 正在为您的站点和负载提供服务 平衡机制正在使用中 不维护任何类型的会话 亲和力,你可能只是弹跳 到其他web服务器并启动 新一届会议;毕竟,在过程中 会话不会跟随您 穿过盒子

状态持久性的备选方案

无论如何,我总是发现InProc即使在专用服务器上也时断时续地不可靠,所以我避免了它

对Cookie要小心——Cookie会随着每个请求(图像、脚本等)一起传输,并且应该保持在最低限度。你可能会想,“嗯,这个项目不需要扩展”,但一旦你做出了项目范围内的设计决定,你将使用cookies来保持你的状态,你就在为一个众所周知的擦伤而努力

我的意思是,您正在脱离最佳实践,可能会遇到一些不好的情况,比如我需要将xml文档持久化一秒钟。这在饼干里可不是个好主意


如果您在共享主机环境中,无法设置会话状态服务器(顺便说一句,这非常简单),那么您可以查看SqlSessionStateStore,它可以将会话数据存储在SQL server中。

Brian的建议非常好,我非常同意他的观点。我还想提供一个额外的可能性

您对应用程序所在的环境了解得多吗?我提出这个问题的原因如下:考虑到您处于一个共享托管环境中,很有可能有多个web服务器托管您的站点。如果有多台服务器为您的站点提供服务,并且正在使用一种负载平衡机制,而该机制不维护任何会话关联性,那么您可以简单地跳转到另一台web服务器并启动一个新会话;毕竟,in-proc会话不会在各个框之间跟随您


思想食粮:-)

好主意,肖恩。希望他们不会在没有会话亲和力的情况下做那样的事情,但你永远不会知道…呵呵。。。是的,我希望他们不会在没有建立亲和力的情况下(至少在没有说出来的情况下)回击请求,但我觉得提到它也没什么坏处:-)不管怎样,很高兴迈卡从布赖恩那里得到了他需要的答案!它还可能与应用程序池回收有关。您可以签入IIS或让主机公司告知应用程序池的设置。有以分钟为单位的限制、一天中的固定时间和基于资源的限制(例如,虚拟内存达到500mb)