失去会话状态

Ada*_*uer 55 asp.net iis session

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

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

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

因为我不知道用户何时会丢失会话并且无法自行复制:

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

下面是我的sessionState配置供参考

<sessionState
           mode="InProc"
           cookieless="false"
           cookieName="My.Site.Com"
           timeout="480"/>
Run Code Online (Sandbox Code Playgroud)

Ada*_*lls 103

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

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

-

如果您使用的是IIS 7或7.5,请查看以下内容:

  1. 默认情况下,IIS将AppPools设置为在一段时间不活动后自行关闭.
  2. 默认情况下,IIS将AppPools设置为每1740分钟回收一次(显然取决于您的根配置,但这是默认设置)
  3. 在IIS中,查看AppPool的"高级设置".在有一个名为"空闲超时"的属性.将其设置为零或高于默认值(20).
  4. 在IIS中,检查AppPool的"回收"设置.在这里,您可以启用或禁用您的AppPool回收.向导的第2页是一种记录每种类型的AppPool关闭的事件日志的方法.

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


小智 5

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

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

cookieless="false"
Run Code Online (Sandbox Code Playgroud)

当我将其更改为以下...

cookieless="UseCookies"
Run Code Online (Sandbox Code Playgroud)

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

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