ASP.NET 网站中出现意外的第二个 AppDomain

Posted

技术标签:

【中文标题】ASP.NET 网站中出现意外的第二个 AppDomain【英文标题】:Unexpected second AppDomain in ASP.NET website 【发布时间】:2012-08-07 16:11:04 【问题描述】:

我的一个类具有将新 GUID 分配给静态变量的静态构造函数。 然后我使用该变量作为我创建的文件夹名称,以在我的网站的生命周期内存储缓存信息。目标是在网站被回收或发生其他情况时使用不同的文件夹名称。

我的网站在 IIS7 中运行,并且配置为最多有一个工作进程。回收已禁用。

我使用 ThreadPool.QueueUserWorkItem 异步发出多个并行数据库请求,然后 ManualResetEvent.WaitOne() 将这些调用合并回一个线程。我使用上述文件夹来缓存这些请求的结果。

我的问题是,似乎在某些时候我会同时创建并运行 2 个文件夹。我理解这意味着我获得了 2 个 AppDomain,而不仅仅是一个。我不明白为什么我会获得第二个 AppDomain 以及我能做些什么来防止它发生。

【问题讨论】:

【参考方案1】:

像往常一样,答案很简单,而且在不同的领域 - 如果是泛型类,则静态成员对于每种类型的类都是不同的。

http://www.codeproject.com/Articles/26514/Generic-Types-Don-t-Share-Static-Members

【讨论】:

好问题,好答案。 OTOH,您应该始终在 ASP.NET 项目中期望多个 AppDomain。只要 IIS 应用程序池正在回收,就会发生这种情况。第一个 AppDomain 被停顿,第二个被启动。在第一个 AppDomain 中的所有请求完成之前,您将同时拥有两个 AppDomain。 @JohnSaunders,对。我认为使用数据库来协商文件夹 GUID 将是一种更可靠的方法。【参考方案2】:

编辑:如果禁用回收,这不是答案,尽管如果您更改 web.config,以下行为仍然会发生。

这个问题可能在进行回收时发生。 IIS7 将创建一个新的工作进程,等待它被读取,然后才会关闭旧的。因此,在 5-30 秒的短暂时间内,您的应用程序将在 2 个工作进程中运行。

您可以通过在应用程序池高级设置中将“禁止重叠回收”设置为 True 来禁用此行为...

【讨论】:

是的,我在回答中说过。 ...尽管如果您更改 web.config,以下行为仍然会发生

以上是关于ASP.NET 网站中出现意外的第二个 AppDomain的主要内容,如果未能解决你的问题,请参考以下文章

Asp .Net Core WebApi:异常的第二次http调用

Silverlight 业务应用程序 - ASP.Net MVC

ASP.NET MVC5 在用户注册时自动填充第二个表

如何解决错误:Asp.Net 请求中出现意外的令牌“<”?

ASP.Net MVC 5 身份验证与另一个 MVC 5 身份网站

ASP.NET 电子商务网站