是否为每个请求创建了AppDomains?

时间:2009-01-17 05:40:43

标签: .net asp.net appdomain

在ASP.NET 3.5(使用IIS6)中,是否为每个请求创建了AppDomains?我知道所有应用程序在w3wp.exe下都有自己的AppDomain,但整个AppDomain究竟有用吗?

我今天和一位试图说服我的同事争论说,如果一个ASP.NET应用程序有一个静态对象(或Singleton类),那么这个对象将在所有请求之间共享。我认为这是错误的。我对吗?我如何说服我的同事?

谢谢!

2 个答案:

答案 0 :(得分:9)

我很遗憾地说你的同事是对的。在ASP.NET应用程序中,IIS中配置的每个应用程序都在其自己的AppDomain中运行,AppDomain是单个对象的范围。所以App1中的单例可用于App1的所有请求(如果不仔细处理,可能会成为并发),但App2中的请求将无法访问App1中的单例。

Threading and Pooling in the HTTP Pipeline
(来源:microsoft.com

MSDN杂志中的这个图表有助于展示每个应用程序如何在自己的AppDomain中隔离。虽然该图显示了IIS5工作进程(aspnet_wp.exe),但IIS6工作进程对于配置为在同一应用程序池中运行的应用程序类似。

答案 1 :(得分:1)

单身人士将存在于appdomain的整个范围内。此外,对您的应用程序的所有请求都将转到相同的应用程序域,因此您的同事实际上是正确的。

更新:由好奇心引发的问题,我找到了一个可以在per-request basis上使用的“单身人士”。我实际上并不是这样推荐的。如果有人需要按请求单身,那么他们需要找到更合适的模式。