失去会话状态

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

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

什么(一般)会导致用户在ASP.net中失去他们的会话?

而且由于我不知道用户何时丢失会话,并且不能自己复制:

我如何跟踪用户丢失会话的时间

以下是我的sessionStateconfiguration参考

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

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

  1. 你的sessionState超时已经过期
  2. 您更新您的web.config或其他文件types,导致您的AppDomain回收
  3. IIS中的AppPool回收
  4. 你用很多文件更新你的站点,而且ASP.NET主动地破坏你的AppDomain来重新编译和保存内存。

如果您使用IIS 7或7.5,则需要查找以下几项内容:

  1. 默认情况下,IIS会将AppPools设置为在一段时间不活动后closures。
  2. 默认情况下,IIS将AppPools设置为每1740分钟回收一次(显然取决于您的根configuration,但这是默认设置)
  3. 在IIS中,查看AppPool的“高级设置”。 有一个属性叫“空闲超时”。 将其设置为零或比默认值(20)更高的数字。
  4. 在IIS中,检查AppPool的“回收”设置。 在这里你可以启用或禁用你的AppPool回收。 向导的第二页是一种login到事件日志的方式,每种types的AppPoolclosures。

如果您使用的是IIS 6,则可以使用相同的设置(大多数情况下,只能通过不同的方式访问),但是让他们logging回收更为麻烦。 这里是一个获取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,以在会话创build或结束时得到通知。 HttpSessionState类还具有IsNewSession属性,您可以检查任何页面请求以确定是否为活动用户创build了新会话。

最后,如果在您的情况下可能,我已经使用了SQL Server会话模式 ,取得了很好的成功。 如果你在其中存储了大量的数据(每个请求都会加载并保存来自SQL Server的全部数据),那么不build议这样做,如果你将自定义对象放入其中(这是因为它们必须是可序列化的),但它帮助我在一个共享的宿主scheme,我无法configuration我的AppPool不回收几个小时。 就我而言,我储存了有限的信息,没有不良的performance效应。 除此之外,现有的用户默认会重用他们的SessionID,而我的用户从来没有注意到他们的内存Session被AppPool回收丢弃的事实,因为他们的所有状态都存储在SQL Server中。

我遇到了ASP.NET 4.0中的情况,我的会话将在每个页面请求上重置(并且我的SESSION_START代码将在每个页面请求上运行)。 这不会发生在每个会话的每个用户,但通常发生,当它发生时,它会发生在每个页面的请求。

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

 cookieless="false" 

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

 cookieless="UseCookies" 

…问题似乎消失了。 显然,true | false是ASP.NET的旧select。从ASP.Net 2.0开始,枚举选项开始可用。 我猜这些选项已被弃用。 过去,“错误”的价值从来没有出现过问题 – 我只注意到ASP.NET 4.0。 我不知道在4.0中有什么改变,不再正确支持它。

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

在我的情况下,设置AppPool-> AdvancedSettings-> Maximum Worker Proccesses to 1帮助。

您可以在Session_Start和Application_Start中将一些日志logging添加到Global.asax中,以跟踪用户的Session和应用程序的整体情况。

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

我只是失去了不是一个string或整数,而是一个数据行的会话。 把数据放在一个可序列化的对象中,并保存到会话中为我工作。

你的会议是失去becoz ….

我发现了一个场景会话丢失 – 在一个asp.net页面,一个文本框的字段有一个无效的字符,其次是一个会话variables检索其他purpose.After发布无效的数字parsing通过Convert.ToInt32或双引发第一次机会exception,但错误不会显示在那一行,而是由于未处理的exception会话为空,会话检索时显示错误,从而欺骗debugging…

提示:testing你的系统失败 – 破坏性的..input足够的垃圾在无关的情况下,例如:在search结果显示在search条件下input垃圾和search结果的细节…,你将能够重现本地代码库也是… 🙂

希望它帮助,hydtechie