在 ASP.NET 3.5(带有 IIS6)中,是否为每个请求创建了 AppDomains?我知道所有应用程序在 w3wp.exe 下都有自己的 AppDomain,但是整个 AppDomain 究竟是如何工作的呢?
今天我和一位同事争论,他试图说服我,如果 ASP.NET 应用程序有一个静态对象(或 Singleton 类),那么这个对象将在所有请求之间共享。我认为这是错误的。我对吗?如何说服我的同事?
谢谢!
我很抱歉地说你的同事是对的。在 ASP.NET 应用程序中,在 IIS 中这样配置的每个应用程序都在其自己的 AppDomain 中运行,这是单例对象的范围。因此,App1 中的单例可用于对 App1 的所有请求(如果不小心处理,可能会成为并发),但 App2 中的请求将无法访问 App1 中的单例。
(来源:microsoft.com)
这张来自 MSDN 杂志的图表有助于展示每个应用程序是如何在其自己的 AppDomain 中隔离的。虽然该图显示了 IIS5 工作进程 (aspnet_wp.exe),但 IIS6 工作进程对于配置为在同一应用程序池中运行的应用程序来说是相似的。
单例将存在于 appdomain 的整个范围内。此外,对您的应用程序的所有请求都将转到同一个 appdomain,因此您的同事实际上是正确的。
更新:这个问题是由好奇心引起的,我发现了一个“单例”,你可以在每个请求的基础上使用它。不过,我实际上并不建议这样做。如果有人需要每个请求的单例,那么他们需要找到更合适的模式。