【问题标题】:InProc session data disapearingInProc 会话数据消失
【发布时间】:2009-08-27 00:08:06
【问题描述】:

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

HttpContext.Current.Session.Add("puzzleInfo", currentPuzzleInfo);

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

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

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

谢谢!

【问题讨论】:

    标签: asp.net session-state


    【解决方案1】:

    疑难解答

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

    服务器上的其他人可能会导致进程崩溃。这是一篇关于解决此类问题的 msdn 博客文章(向下滚动大约 25%):http://blogs.msdn.com/webtopics/archive/2009/07/22/in-proc-session-state-management.aspx

    这在共享托管环境中对您没有多大帮助,但您可以将其传递到支持链中。也许他们可以查看事件日志并确定谁在破坏 IIS 并让他们启动。

    正如 Sean McDonough 所说:

    ...假设您在共享主机中 环境不错,有机会 有多个 Web 服务器 托管您的网站。如果多台服务器 正在为您的网站和负载提供服务 平衡机制正在使用中 不维护任何类型的会话 亲和力,你可能只是弹跳 到不同的 Web 服务器并启动 一个新的会话;毕竟,进程内 会话不会跟随你 跨框。

    状态持久性的替代方案

    无论如何,我一直发现 InProc 即使在专用服务器上也会间歇性地不可靠,因此我避免使用它。

    谨慎使用 cookie —— cookie 随每个请求(图像、脚本等)一起传输,应保持在最低限度。你可能会想,“嗯,这个项目不需要扩展”,但是一旦你做出了项目范围的设计决定,你将使用 cookie 来保持你的状态,你就会遇到众所周知的挫伤。

    我的意思是,您正在退出最佳实践,可能会遇到一些丑陋的情况,例如我需要将 xml 文档持久化一秒钟。这在 cookie 中可不是个好主意!

    如果您因为处于共享托管环境而无法设置会话状态服务器(顺便说一句,这很容易),您可以查看 SqlSessionStateStore,它可以让您将会话数据存储在SQL Server。

    【讨论】:

      【解决方案2】:

      Brian 的建议非常好,我完全同意他的观点。我还想提供另一种可能性。

      您对托管应用程序的环境了解很多吗?我问的原因如下:鉴于您处于共享托管环境中,很有可能有多个 Web 服务器托管您的网站。如果多个服务器正在为您的站点提供服务,并且正在使用的负载平衡机制不维护任何类型的会话亲和性,那么您可能只是跳到不同的 Web 服务器并开始一个新会话;毕竟,进程内会话不会跟着你跨框。

      值得深思:-)

      【讨论】:

      • 好主意肖恩。希望他们不会在没有会话亲和力的情况下做这样的事情,但你永远不知道......
      • 嘿...是的,我希望他们不会在没有建立亲和力的情况下反弹请求(至少没有这样说),但认为提及它不会有什么坏处:-)无论如何,很高兴 Micah 从 Brian 那里得到了他需要的答案!
      • 它也可能与应用程序池回收有关。您可以签入 IIS 或让您的托管公司告知您的应用程序池的设置。有分钟限制、一天中的固定时间和基于资源的限制(例如虚拟内存达到 500mb)
      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多