什么会导致ASP.NET辅助进程被回收?

时间:2020-03-06 14:22:11  来源:igfitidea点击:

这是我当前的问题:

我猜我的问题(如下所述)是由ASP.NET工作进程被回收引起的,根据下面的答案我正在使用InProc会话存储,由于其他方面的限制,我看不到有太多的机会所有会话对象都可序列化的存储类型。但是,据我所知,我无法弄清楚是什么原因使工作进程被回收,因为据我所知,app目录中的文件没有任何更改,并且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是否卡住了。

解决方案

工作进程可能正在循环。
http://www.lattimore.id.au/2006/06/03/iis-dropping-sessions/

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

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

  • 编辑Web.Config
  • IIS重置
  • 等等。

如果会话状态对应用很重要,请使用SQL状态管理或者ASP附带的状态服务器。网。

干杯,

RB。

这可能是由于后台线程中未处理的异常引起的。它可能导致ASP.NET辅助进程终止。新过程很快启动,因此我们实际上没有注意到它,但是所有会话都丢失了。

这是一篇比我能更好解释的文章:ASP.NET 2.0未处理的异常问题

引用:

An unhandled exception in a running ASP.NET 2.0 application will usually terminate the W3WP.exe process, and leave you with a very cryptic EventLog entry something like this:
  
  "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."

这是一篇Microsoft KB文章,解释了相同的问题:KB911816未处理的异常导致基于ASP.NET的应用程序在.NET Framework 2.0中意外退出

我的猜测是内存消耗,但是,将IIS设置为记录日志回收,我们肯定会知道。

当我们确实将AnkerEx应用程序迁移到
新服务器。新服务器具有Microsoft Windows Server 2008作为操作系统
和Microsoft Internet Information Services7. 还在服务器中安装了
.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">
...

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