失去会话状态

时间:2010-08-18 19:36:12

标签: asp.net iis session

我有一个ASP.net应用程序,其中用户无法成功完成某些操作,原因,我假设,只能与丢失其会话相关(这是我维护其当前用户信息的地方,以及如何确定他们是否已登录)

我不知道为什么会失去他们的会话,所以我的第一个问题是:

什么(一般情况下)会导致用户在ASP.net中丢失会话?

因为我不知道用户什么时候会丢失会话并且无法自己重现:

如何跟踪用户何时失去会话

以下是我的sessionState配置供参考

<sessionState
           mode="InProc"
           cookieless="false"
           cookieName="My.Site.Com"
           timeout="480"/>

8 个答案:

答案 0 :(得分:103)

许多事情会导致会话状态神秘地消失。

  1. 您的sessionState超时已过期
  2. 您更新了导致AppDomain回收的web.config或其他文件类型
  3. IIS中的AppPool回收
  4. 您使用大量文件更新您的网站,并且ASP.NET会主动销毁您的AppDomain以重新编译并保留内存。
  5. -

    如果您使用的是IIS 7或7.5,请注意以下几点:

    1. 默认情况下,IIS会将AppPools设置为在一段时间不活动后自行关闭。
    2. 默认情况下,IIS将AppPools设置为每1740分钟回收一次(显然取决于您的根配置,但这是默认配置)
    3. 在IIS中,查看AppPool的“高级设置”。在有一个名为“空闲超时”的属性。将其设置为零或高于默认值(20)。
    4. 在IIS中,检查AppPool的“回收”设置。在这里,您可以启用或禁用您的AppPool回收。向导的第2页是一种记录每种类型的AppPool关闭的事件日志的方法。
    5. 如果您使用的是IIS 6,则会应用相同的设置(大多数情况下,但使用不同的方式)但是让他们记录回收更加困难。以下是获取IIS 6以记录AppPool回收事件的方法的链接:

      http://web.archive.org/web/20100803114054/http://surrealization.com/sample-code/getnotifiedwhenapppoolrecycles/

      -

      如果要更新Web应用程序中的文件,则应该会丢失所有会话。这只是野兽的本质。但是,您可能不会期望它多次发生。如果您更新了15个或更多文件(aspx,dll等),则有可能在一段时间内重新启动多次,因为访问该站点的用户会重新编译这些页面。请参阅以下两个链接:

      http://support.microsoft.com/kb/319947

      http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx

      将numCompilesBeforeAppRestart设置为更高的数字(或手动弹回AppPool)将消除此问题。

      -

      您始终可以处理Application_SessionStart和Application_SessionEnd,以便在创建或结束会话时收到通知。 HttpSessionState类还具有IsNewSession属性,您可以检查任何页面请求,以确定是否为活动用户创建了新会话。

      -

      最后,如果在您的情况下有可能,我已经使用SQL Server session mode取得了很好的成功。如果您要在其中存储大量数据(不是每个请求加载并从SQL Server保存全部数据),建议不要这样做,如果要在其中放置自定义对象,则可能会很麻烦(因为它们必须是可序列化的) ),但它帮助我在共享主机方案中,我无法配置我的AppPool不回收几个小时。在我的情况下,我存储了有限的信息,并没有不良的性能影响。除此之外,现有用户默认重用其SessionID这一事实,我的用户从未注意到他们的内存会话被AppPool回收器丢弃,因为他们的所有状态都存储在SQL Server中。

答案 1 :(得分:2)

我遇到了ASP.NET 4.0的情况,我的会话将在每个页面请求上重置(我的SESSION_START代码将在每个页面请求上运行)。每次会话都不会发生这种情况,但通常会发生这种情况,一旦发生,就会在每个页面请求中发生。

我的web.config sessionState标记与上面提到的设置相同。

cookieless="false"

当我将其更改为以下内容时......

cookieless="UseCookies"

......问题似乎消失了。显然,true | false是来自ASP.NET的旧选择1.从ASP.Net 2.0开始,枚举选项开始可用。我想这些选项已被弃用。 “错误”值在过去从未出现过问题 - 我只注意到了ASP.NET 4.0。我不知道4.0中的某些内容是否已经改变,不再正确支持它。

另外,我不久前才发现这一点。由于问题之前是间歇性的,我想我仍然可以遇到它,但到目前为止它正在使用这个新设置。

答案 2 :(得分:2)

在我的案例中,将AppPool-&gt; AdvancedSettings-&gt;最大工作人员过程设置为1有帮助。

答案 3 :(得分:1)

您的会话丢失了becoz ....

我找到了会话丢失的场景 - 在asp.net页面中,对于金额文本框字段具有无效字符,然后是用于其他目的的会话变量检索。在通过转换发布无效数字解析之后。 ToInt32或double引发了第一次机会异常,但错误没有显示在该行,而不是因为未处理的异常,Session为空,在会话检索时显示错误,从而欺骗调试...

提示:测试你的系统失败 - 破坏..在不相关的场景中输入足够的垃圾,例如:在显示的搜索结果中输入搜索条件中的垃圾并转到搜索结果的详细信息......,你就可以重现这个你的本地代码基础上的机器......:)

希望它能帮助,保持水力

答案 4 :(得分:0)

您可以在Session_Start和Application_Start中向Global.asax添加一些日志记录,以跟踪用户的Session和整个应用程序的运行情况。

另外,请注意,您正在以Web场模式运行(应用程序池中定义的多个IIS线程)或负载平衡,因为用户最终可能会遇到不具有相同内存的其他服务器。如果是这种情况,您可以将会话模式切换到SQL Server。

答案 5 :(得分:0)

我只是失去了一个不是字符串或整数而是数据流的会话。 将数据放入可序列化的对象并将其保存到会话中对我有用。

答案 6 :(得分:0)

通过Ajax检索内容时,IIS 8出现问题。问题是MaximumWorkerProcesses设置为2,Javascript打开了17个并发请求。这比AppPool可以处理的更多,并且打开了一个新池(没有auth-data)。

解决方法是将MaximumWorkerProcesses中的0更改为IIS -> Server -> Application Pools -> [myPool] -> Advanced Settings -> Process Model -> MaximumWorkerProcesses

答案 7 :(得分:0)

不知道是否与您的问题有关,但Windows 2008 Server R2或SP2已更改其IIS设置,从而导致会话持久性出现问题。默认情况下,它为HTTP和HTTPS管理单独的会话变量。在HTTPS中设置变量后,只要切换,这些变量将仅在HTTPS页面上可用。

要解决此问题,提供了IIS设置。在IIS管理器中,打开ASP属性,展开会话属性,然后更改 将安全连接上的新ID 更改为 False