什么原因会导致ASP.NET工作进程被回收?

4

这是我目前的问题:

我猜测我的问题(如下所述)是由于 ASP.NET 工作进程被回收引起的,根据以下答案 - 我正在使用 InProc 会话存储,并且不太可能移动,因为对于其他类型的存储,所有会话对象都必须可序列化。但是,我无法弄清楚为什么工作进程会像我看到的那样经常被回收 - 据我所知,应用程序目录中的文件没有更改,并且 IIS 中的选项似乎意味着进程只会每 1,740 分钟回收一次 - 这比实际会话丢失频率要低得多。那么,我的问题现在是,除了会话超时外,还有哪些情况会导致 ASP.NET 工作进程被回收?

这是我的原始问题:

我在 ASP.NET Web 应用程序中遇到一个难以重现的问题。该应用程序具有一个主 .aspx 页面,加载并初始化多个会话变量。该页面使用 ASP.NET Ajax 的 Sys.Net.WebRequest 类重复访问另一个 .aspx 页面,该页面使用会话变量进行数据库查询并更新主页面(主页面从未重新请求)。

偶尔,在使用页面一段时间后,导致会话正确传递到子页面的成功 HTTP 请求之后,其中一个请求似乎会导致创建新的 ASP.NET 会话 - 所有会话变量都丢失(在我的代码中引发异常),并报告新的会话 ID 在动态请求的页面中。这意味着突然间,主页面与服务器断开连接 - 就服务器而言,用户不再登录。

我几乎可以确定这不是会话超时 - 超时时间设置为可笑的时间,使其发生的时间是可变的,但从不足以使会话超时,并且常量 Sys.Net.WebRequests 应该刷新会话计时器。

那么,还有什么其他可能会导致 HTTP 请求失去与 ASP.NET 会话联系的情况?不幸的是,当这种情况发生时,我没有嗅探网络流量,否则我会检查 ASP.NET 会话 cookie 是否存在。

5个回答

3
我们在将AnkerEx应用程序迁移到新服务器时遇到了会话问题。新服务器采用Microsoft Windows Server 2008操作系统和Microsoft Internet Information Services 7,并安装了.NET Framework版本为1.0.3705、1.1.4322、2.0.50727、3.0和3.5。 为解决这个问题,我启用了ASP.NET 2.0中与应用程序寿命周期相关的事件的健康监控。我在web.config文件中添加了以下内容:
...
...
<system.web>
...
...
    <healthMonitoring>
      <rules>
        <add name="Application Events"
            eventName="Application Lifetime Events"
            provider="EventLogProvider"
            profile="Default"
            minInterval="00:01:00" />
      </rules>
    </healthMonitoring>
...
...

帮助我们检查AppDomain的回收情况对我们有很大的帮助。我们可以在事件查看器中查看到它。 更多详细信息的链接是http://blogs.msdn.com/rahulso/archive/2006/04/13/575715.aspx

当我添加完web.config后,事件查看器显示每次点击应用程序中的几乎任何链接时都会重新启动我的应用程序。 从http://blogs.msdn.com/toddca/archive/2005/12/01/499144.aspx的文章中,我发现ASP.NET有了新的行为-如果我们删除应用程序根目录的子目录,那么ASP.NET 2.0将重新启动AppDomain。

问题在于,我在web.config中有以下指令:

...
<compilation debug="true" tempDirectory="c:\AnkerEx\Temporary ASP.NET files">
...

即ASP.NET在我的应用程序根目录下编译了aspx页面。我认为他创建了一些文件夹,也可能删除了其中的一些。我删除了tempDirectory指令,然后应用程序开始稳定运行。


3

一种解决方案是使用StateServer,而不是InProc会话管理。

许多事情可能导致会话状态丢失:

  1. 编辑Web.Config
  2. IIS重置
  3. 等等。

如果会话状态对您的应用程序很重要,则使用SQL状态管理或随ASP.NET一起提供的State Server。

干杯,

RB。


1

实际上,当一个工作进程被回收时,原始进程会继续运行并为现有会话提供服务,直到没有剩余的ASP.NET会话为止。所有会话都将在新的工作进程中创建。然而,经典ASP会话会丢失。 - Kev
据我所了解,如果您的ASP.NET应用程序正在使用InProc会话管理,则在工作进程被回收时,会话确实会丢失。 - John Calsbeek

1
可能是由于后台线程中未处理的异常引起的。这可能导致您的ASP.NET工作进程终止。新进程会非常快地启动,因此您实际上并没有注意到它,但是所有会话都会丢失。
这里有一篇文章比我能更好地解释它: ASP.NET 2.0未处理异常问题 引用:
未处理的异常在运行的ASP.NET 2.0应用程序中通常会终止W3WP.exe进程,并留下一个非常神秘的EventLog条目,类似于以下内容:
“EventType clr20r3,P1 w3wp.exe,P2 6.0.3790.1830,P3 42435be1,P4 app_web_ncsnb2-n,P5 0.0.0.0,P6 440a4082,P7 5,P8 1,P9 system.nullreferenceexception,P10 NIL。”

这里有一篇微软知识库文章,解释了同样的问题:KB911816 未处理的异常导致基于ASP.NET的应用程序在.NET Framework 2.0中意外退出


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接