一个ASP.NET应用程序(意外地)在多个应用程序域或频繁的应用程序recycing

时间:2011-06-28 04:24:52

标签: asp.net appdomain

我正在调试一个看似随机丢失某些静态字段内容的ASP.NET应用程序。我做了一些简单的自定义日志记录(因为即使log4net也不稳定),并发现该应用程序正被加载到两个应用程序域中。这是日志中的一个片段:

6/27/2011 9:01:01 PM /LM/W3SVC/1/ROOT/MyApp-1-129537072581658334: log message 1
6/27/2011 9:01:01 PM /LM/W3SVC/1/ROOT/MyApp-1-129537072581658334: log message 2
6/27/2011 9:01:01 PM /LM/W3SVC/1/ROOT/MyApp-1-129537072581658334: log message 3
6/27/2011 9:01:01 PM /LM/W3SVC/1/ROOT/MyApp-1-129537072581658334: log message 4
6/27/2011 9:01:02 PM /LM/W3SVC/1/ROOT/MyApp-4-129537072620628334: log message 5 <-
6/27/2011 9:01:02 PM /LM/W3SVC/1/ROOT/MyApp-4-129537072620628334: log message 6
6/27/2011 9:04:50 PM /LM/W3SVC/1/ROOT/MyApp-1-129537074647228334: log message 7
6/27/2011 9:04:50 PM /LM/W3SVC/1/ROOT/MyApp-1-129537074647228334: log message 8

时间/日期之后的项目是当前的应用程序域名。

应用程序只是一个常规的ASP.NET(而不是MVC)应用程序,它处理一些AJAX请求并将它们传递给一堆ASP.NET库。唯一不寻常的是,其中一个库使用一些反射来查找某些类,然后实例化它们并在不同的线程上运行它们。但它没有明确地与app域做任何事情。

顺便说一句,日志文件中突出显示的行来自ASP.NET应用程序本身(即不是来自其中一个单独的线程)来自ASPX处理程序。

我是否正确解释了日志?如果是这样,什么可能导致应用程序从多个应用程序域加载和提供?

修改:此问题与此问题基本相关:ASP.NET Application state vs a Static object。但是,根据我今天看到的情况,似乎不可能依赖静态字段。我可以将所有内容移动到Application对象,但我想同步会有点麻烦。我越来越相信应用程序会做一些非标准的事情。

编辑2:我做了一些调查,似乎应用程序和应用程序域之间始终存在1-1关系(这是我期望的)。所以我认为我所看到的就是回收利用。

编辑3:经过一些实验和探索之后,我启用了IIS运行状况监控(基于http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx),并发现应用程序已快速连续启动两次。这实际上非常令人费解。以下是日志事件:

Event code: 1003 
Event message: Application compilation is starting. 
Event time: 6/28/2011 8:34:31 AM 
Event time (UTC): 6/28/2011 3:34:31 PM 
Event ID: d42336b18c264516a4ba5aa1e62df276 
Event sequence: 1 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/1/ROOT/MyApp-1-129537488697736549 
    Trust level: Full 
    Application Virtual Path: /MyApp 
    Application Path: [snip]\MyApp\ 
    Machine name: US-SEA-R9759B2 

Process information: 
    Process ID: 7624 
    Process name: w3wp.exe 
    Account name: IIS APPPOOL\DefaultAppPool 

----

Event code: 1001 
Event message: Application is starting. 
Event time: 6/28/2011 8:34:33 AM 
Event time (UTC): 6/28/2011 3:34:33 PM 
Event ID: f7fbecb1ba1a4a24833016cec47458c6 
Event sequence: 1 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/1/ROOT-2-129537488729428362 
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: [snip]\RootApp\ 
    Machine name: US-SEA-R9759B2 

Process information: 
    Process ID: 7624 
    Process name: w3wp.exe 
    Account name: IIS APPPOOL\DefaultAppPool 

----

Event code: 1001 
Event message: Application is starting. 
Event time: 6/28/2011 8:34:40 AM 
Event time (UTC): 6/28/2011 3:34:40 PM 
Event ID: 07a3dc31e8804caca1ddc3b2101962e3 
Event sequence: 1 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/1/ROOT-3-129537488807712839 
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: [snip]\RootApp\ 
    Machine name: US-SEA-R9759B2 

Process information: 
    Process ID: 7624 
    Process name: w3wp.exe 
    Account name: IIS APPPOOL\DefaultAppPool 

----

Event code: 1001 
Event message: Application is starting. 
Event time: 6/28/2011 8:34:40 AM 
Event time (UTC): 6/28/2011 3:34:40 PM 
Event ID: db304b519a084fa797fbcfe66fbb0b48 
Event sequence: 1 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/1/ROOT/MyApp-4-129537488808502885 
    Trust level: Full 
    Application Virtual Path: /MyApp 
    Application Path: [snip]\MyApp\ 
    Machine name: US-SEA-R9759B2 

Process information: 
    Process ID: 7624 
    Process name: w3wp.exe 
    Account name: IIS APPPOOL\DefaultAppPool 

MyApp应用程序位于另一个应用程序(RootApp)中。我期望的是两条日志消息:MyApp启动和RootApp启动。

2 个答案:

答案 0 :(得分:2)

您是否意外将AppPool属性(性能标签)中的工作进程数设置为2?

在这些属性中,可能还有一个设置,让您的AppPool根据数量或请求或任何回收设置过于频繁地回收

答案 1 :(得分:1)

如果我不得不猜测您的网站上有什么内容正在更改web.config文件,dll,aspx,asmx或其他一些文件。每当这些文件被更改时,Web应用程序的新实例就会启动,并且在从旧应用程序从现有应用程序提供服务时,将从该新Web应用程序提供任何新请求。一旦所有旧请求完成,旧应用程序将关闭。这对于部署很有用,因为它不会破坏现有会话,但这意味着您不应该在每个请求或类似事件上自动更改web.config文件。

此页面详细介绍了其工作原理 http://technet.microsoft.com/en-us/library/cc759560(WS.10).aspx