对于同一 IIS 服务器 ASP.NET 上的 2 个应用程序,会话丢失太快

Posted

技术标签:

【中文标题】对于同一 IIS 服务器 ASP.NET 上的 2 个应用程序,会话丢失太快【英文标题】:Session lost too fast for 2 apps on the same IIS server , ASP.NET 【发布时间】:2012-02-16 01:55:38 【问题描述】:

我的 IIS 上有 2 个应用程序在同一个域上运行。 每个都有自己的目录。

示例:

1) www.a.com/dir1 - APP1

2) www.a.com/dir2 - APP2

两个应用程序都在 inProc 模式下运行。

我不使用任何负载平衡。

不管我输入的所有设置如何,APP2(APP1 工作正常)都会在 7 到 10 分钟后失去会话。

我已经厌倦的事情:

1) 更改 APP2 的 cookie 名称,以便每个应用程序都有一个唯一的会话 cookie 名称。

2) 我已将超时窗口设置为 240 分钟。

3) 我已将日志记录在应用程序开始和结束事件以及会话开始和结束上,但没有发现任何异常,(我看到调用了会话结束事件和调用了应用程序结束)

4) 我已确定没有防病毒软件正在扫描我的 web.config 文件。

5) 我已将 APP1 移至不同的应用程序池。

您的想法将不胜感激。

【问题讨论】:

【参考方案1】:

您能否检查您的会话是否正在运行“InProc”模式?如果是,那么您可能需要将您的应用程序配置为使用状态服务器或数据库会话模式。

【讨论】:

是的,我所有的应用程序都是 inProc 模式。为什么我必须这样做?我不需要他们共享 ASP.NET 会话... 嗯。请参考msdn.microsoft.com/en-us/library/ms972429.aspx。 “进程内模式只是意味着以与经典 ASP 会话状态类似的方式使用 ASP.NET 会话状态。也就是说,会话状态是在进程中管理的,如果进程被重新循环,状态就会丢失。鉴于新的设置ASP.NET 提供,你可能想知道为什么你会使用这种模式。原因很简单:性能。来自同一个链接.. 这意味着会话被回收,并且我在代码中的任何时候都没有回收我的会话,所以我想知道为什么我的 inProc 会话被回收了?难道是2个aps共享同一个进程工作者????尽管它们位于不同的应用程序池中? 工作进程可以随时自行回收。您不必明确地这样做。例如,如果 App1 是一个显示来自 CMS 的内容的应用,而 App 2 正在创建适合 App1 的大量报告,那么 App2 很可能会在 App1 不会回收时进行回收。 因此,如果我的内存不足并且 IIS 需要清理,则可能会发生这种情况。好吧,我的两个应用程序都没有生成大报告,也没有使用大量内存,而且我的服务器在生产环境中有大量可用内存......【参考方案2】:

这很奇怪。您是否尝试过将两个应用程序保存在单独的工作进程(应用程序池)中?

【讨论】:

是的,两个应用程序都位于 IIS 上的不同应用程序池中。 您的网站负载均衡吗?如果是,InProc 将无法工作,您将需要状态服务器或 SQL 会话状态。【参考方案3】:

这很奇怪,你尝试过的东西都是很好的检查。您确定某处没有任何 Session.Clear() 吗?

如果 APP1 没有运行,APP2 是否仍会丢失会话? 工作进程的内存有多大?虽然,如果它重置,我想你会在 Session start 和 end 中看到一些东西。

【讨论】:

我不使用 Session.Clear()。两个 APPS 一起运行,没有 APP1 APP2 无法运行,所以我无法测试...

以上是关于对于同一 IIS 服务器 ASP.NET 上的 2 个应用程序,会话丢失太快的主要内容,如果未能解决你的问题,请参考以下文章

IIS6 上的 ASP.NET MVC

IIS 错误 502.5 上的 ASP.NET Core 1.0

IIS 6 上的 ASP.NET 路由

IIS 中 ASP.net 应用程序的单独应用程序池

部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误

IIS 7.5 上的 ASP.NET MVC