我大约一周前才注意到这一点。我正在存储有关用户正在玩的当前谜题的数据(www.wikipediamaze.com),如下所示:
HttpContext.Current.Session.Add("puzzleInfo", currentPuzzleInfo);
我知道使用“InProc”模式在会话中存储数据非常不稳定,并且每当 web.config 更改或任何其他因素(包括回收应用程序池)时都会重置。
然而,我的数据一次只停留几秒钟(时间是可变的,但实际上一点也不长),然后就消失了。我处于共享托管环境中,所以我不知道这是否与此有关。
知道发生了什么事吗?如果我将其作为 cookie 直接存储在客户端上会更好吗?请帮忙。
Thanks!
故障排除
每隔几秒丢失数据是不寻常的,您的共享托管提供商可能存在问题 - 听起来服务器由于某种原因不断丢弃会话。您可以显示 sessionID (Session.SessionID) 并查看它是否发生变化。
服务器上的其他人可能会导致进程崩溃。这是一篇关于解决此类问题的 msdn 博客文章(向下滚动大约 25%):http://blogs.msdn.com/webtopics/archive/2009/07/22/in-proc-session-state-management.aspx http://blogs.msdn.com/webtopics/archive/2009/07/22/in-proc-session-state-management.aspx
在共享托管环境中,这对您没有太大帮助,但您可以将其传递给支持链。也许他们可以查看事件日志并确定谁破坏了 IIS,然后引导他们。
正如肖恩·麦克唐纳所说:
...假设您位于共享主机中
环境好,有机会
有多个网络服务器
托管您的网站。如果有多个服务器
正在为您的网站和负载提供服务
平衡机制正在使用中
不维持任何类型的会话
亲和力,你可能只是弹跳
到不同的网络服务器并启动
新的会话;毕竟,在进程中
session 不会跟随你
跨越盒子。
状态持久性的替代方案
无论如何,我总是发现 InProc 即使在专用服务器上也会间歇性地不可靠,因此我避免使用它。
请谨慎对待 Cookie——Cookie 会随每个请求(图像、脚本等)一起传输,并且应保持在最低限度。您可能会想,“嗯,这个项目不需要扩展”,但是一旦您做出了项目范围的设计决策,即您将使用 cookie 来保存您的状态,那么您就会遭遇众所周知的挫伤。
我的意思是,您正在脱离最佳实践,并且可能会遇到一些丑陋的情况,就像我需要暂时保留 xml 文档一样。这在饼干中可不是一个好主意!
如果您由于处于共享托管环境中而无法设置会话状态服务器(顺便说一下,这非常简单),您可以查看 SqlSessionStateStore,它可以让您将会话数据存储在 SQL Server 中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)