asp.net - 丢失 session 状态

标签 asp.net iis session

我有一个 ASP.net 应用程序,其中用户无法成功完成某些操作,我假设的原因只能与丢失 session 有关(这是我维护其当前用户信息的地方,并且如何判断是否登录)

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

什么(通常)会导致用户在 ASP.net 中丢失 session ?

因为我不知道用户何时丢失 session 并且无法自己重现它:

如何跟踪用户何时丢失 session

下面是我的 sessionState 配置供引用

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

最佳答案

许多事情都可能导致 session 状态神秘消失。

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

-

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

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

如果您使用的是 IIS 6,则适用相同的设置(在大多数情况下,但访问它们的方式不同),但是让它们记录回收则更加痛苦。以下是让 IIS 6 记录 AppPool 回收事件的方法的链接:

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

-

如果您正在更新网络应用程序上的文件,您应该预料到所有 session 都会丢失。这就是野兽的本性。但是,您可能没想到它会发生多次。如果您更新 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 以便在 session 创建或结束时收到通知。 HttpSessionState 类还有一个 IsNewSession属性,您可以检查任何页面请求以确定是否为事件用户创建了新 session 。

-

最后,如果您的情况可能的话,我使用了 SQL Server session mode取得了良好的成功。如果您在其中存储大量数据(每个请求都从 SQL Server 加载并保存全部数据),则不建议这样做,并且如果您在其中放入自定义对象(因为它们必须是可序列化的),这可能会很痛苦),但它在共享托管场景中帮助了我,在该场景中我无法将我的 AppPool 配置为不回收几个小时。就我而言,我存储了有限的信息,并且没有对性能产生不利影响。除此之外,默认情况下现有用户将重用其 SessionID,而我的用户从未注意到他们的内存中 session 已被 AppPool 回收删除,因为它们的所有状态都存储在 SQL Server 中。

关于asp.net - 丢失 session 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3515947/

相关文章:

javascript - dropdownlist 选定的索引选项不适用于 JavaScript

asp.net - IIS HTTP 错误 500.19

Azure 网站日志在条目中包含内部 IP

java - 非法尝试将代理与两个打开的 session 相关联

php - 使用 session 传输表值

c# - 为 ASP.NET MVC5 关系创建 DropDownList

asp.net - 如何在 ASP .NET Core 2.0 Web API 中验证自定义 token (不是 JWT)?

asp.net - 重定向到登录页面 asp.net

c# - 处理 ASP.NET 5 中的 JSON 循环引用异常

php - 简单的登录 session php