asp.net - 多个应用程序域中的一个 ASP.NET 应用程序(意外)或频繁的应用程序回收

标签 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 库。唯一不寻常的是,其中一个库使用了一些反射来查找一些类,然后这些类在单独的线程上实例化并运行它们。但它不会对应用程序域做任何明确的事情。

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

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

编辑:这个问题本质上和这个有关: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 启动。

最佳答案

您是否不小心将 AppPool 属性(性能选项卡)中的工作进程数设置为 2?

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

关于asp.net - 多个应用程序域中的一个 ASP.NET 应用程序(意外)或频繁的应用程序回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6501528/

相关文章:

javascript - 是否有访问 JSON.parse XMLHTTPRequest.responseText 的通用方法?

javascript - 如何从 Javascript 调用 ASP.Net 页面上的静态方法?

c# - MEF 和 ShadowCopying DLL,以便我可以在运行时覆盖它们

c# - 静态非托管 dll C# 包装器和多线程、多域

c# - 将套接字传递给新的 AppDomain

c# - 跨 AppDomain 的自定义序列化

asp.net - 如何动态更改母版页的母版页?

html - 如何在 ASP 中添加空格NET MVC View

c# - Facebook 离线访问 .NET SDK

c# - 从自己的 AppDomain 中的单元测试启动 WPF 应用程序