【问题标题】:asp.net mvc session expires often at hosting environmentasp.net mvc 会话在托管环境中经常过期
【发布时间】:2011-05-04 14:43:46
【问题描述】:

如果其他人有同样的问题并得到解决,将不胜感激分享他的解决方案:

问题: 我在 asp.net mvc3 中完成了网站,会话经常过期,在几秒钟到最多 5 分钟之间。在 web.config 中,我将超时设置为 2880 分钟,我还将 sessionstate 设置为 stateserver。我还删除了超时以使用默认超时,仍然有问题:

<sessionState mode="StateServer"></sessionState>
<authentication mode="Forms">
   <forms loginUrl="~/Account/LogOn"/>
</authentication>

我做了一个示例网站,只包含登录功能和一些数据库交互来模拟环境,然后我得到了一个更稳定的超时时间 2 分 50 秒(测试了 9 次),因为我设置了 2880 仍然不正确分钟在 web.config 中。

在用户登录时的代码内部,我创建了一个 AuthenticateTicket 并将其保存到 cookie,然后在安全页面中我检查了 User.Identity 并且控制器具有过滤器 [Authorize],因此当会话到期时,我被发送到登录页面。

在同一台托管服务器上,我有其他使用 .NET 3.5 Web 表单的旧应用程序,对他们来说会话没问题,只有新的 mvc3 和 mvc3 会话经常过期。感谢您提供任何线索。

【问题讨论】:

  • 托管在 Arvixe 服务器中

标签: asp.net-mvc-3 session-timeout


【解决方案1】:

决赛:

我的具体问题是我的主机 (Arvixe) 为每个网站设置了 100 MB 内存的限制。由于映射到数据库的复杂查询,使用 EF(可能还有任何 ORM)会增加内存使用量,因此我的网站使用超过 100 MB,导致应用程序池由于 100MB 内存限制而重新启动,因此重置了 Session。

解决方案:

  • 优化您的 MVC 网站 (see this post)
  • 使用另一种方式来保持会话,可能是将其存储在 SQL 数据库中。
  • 升级到虚拟或专用服务器

对于我的具体情况,将每个网站设置为使用共享应用程序池暂时解决了问题,而我按照第一个选项的帖子优化我的网站,这样我就可以达到 Arvixe 的 100MB 内存限制。

【讨论】:

  • 最后,我再次切换到专用应用程序池,并使用以下方法将会话保持在服务器级别:
【解决方案2】:

我遇到了类似的问题,我的会话在 30 秒左右停止,这只发生在我的开发环境中。 我在这里找到了我的解决方案: http://forum.winhost.com/showthread.php?t=9017

尝试将您的机器密钥添加到您的网站。

【讨论】:

    【解决方案3】:

    这可能是使用共享主机时的常见问题,原因如下:

    您正在与其他客户共享服务器,并且 ASP.NET 工作进程正在频繁重启。

    您的主机正在使用负载平衡服务器,并且您正在访问一台服务器,然后在随后的访问中,您又访问了另一台没有会话数据的服务器。

    最佳解决方法是:

    1,如果您的主机有一个 SQL 数据库,请查看为共享会话状态设置数据库。

    2,编写代码时不要长时间依赖会话中的值 - 始终先进行检查,如果对象不在会话中,则重新构建对象。

    3,考虑转移到 VPS 或升级您的计划。

    【讨论】:

    • 谢谢,我会问我的主机,如果解决了问题,请在这里通知。
    • 看起来问题是这个%....$托管公司设置了一个不切实际的内存限制100 MB,如果你使用EF,很容易达到,导致应用程序池重新启动,因此会话丢失。我还没有确认,但可以检查这个ASP.NET MVC and EF Code First Memory Usage
    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多