ASP.NET Web应用程序在部署后不会卸载AppDomain

Rus*_*voe 7 c# asp.net iis appdomain

当我们部署我们的Web应用程序时,我们将所有代码复制到一个新目录,然后将iis指向该新目录.当我们这样做时,appdomains的数量会增加但不会减少.此外,我们的Application_End事件似乎永远不会触发.

在未知的时间内,虽然perfmon仍然报告了两组AppDomain,但系统执行效果非常差,而GC峰值的时间百分比达到100%.最后,我回收应用程序池,让应用程序再次顺利运行.

额外的信息:在我的开发机器上列出appdomains显示2,但在实时服务器上运行4 ...我们只在池中运行一个应用程序,这意味着我们正在使用的一些库正在创建应用程序域.

我该怎么做才能尝试调试正在发生的事情?什么会阻止应用程序域卸载?

2014年9月3日更新

获得更详细的日志信息后,看起来问题不在于旧的应用程序域,它是重新启动时创建的新应用程序域.它不是启动一个新实例的应用程序,而是启动两个实例.有时我们从旧实例获取application_end,有时我们不会.

2014年9月4日更新

这两件事都在发生.使用进程资源管理器,我可以在其中一台计算机上看到旧的应用程序域仍在那里并且已经启动了新的应用程序域.在另一台机器上只有2个应用程序域,但它们的顺序ID存在差距.因此开始了两个实例(我们也从应用程序启动时获取了一条日志消息),其中一个实例几乎立即就消失了,留下了2个应用程序域.

Rus*_*voe 3

尽管我不确定这是应用程序未卸载应用程序域的唯一原因,但这肯定是原因之一。实际的答案远不如我用来找出答案的步骤那么有趣。

  1. 我编写了一个小 ruby​​ 脚本,以便在 10 个线程中针对我们的应用程序发出 100 个请求(设置 jmeter 将花费比这更多的时间)。
  2. 运行脚本并在运行时多次更改应用程序配置文件。这花了几分钟。
  3. 我使用进程资源管理器来确认确实有 4 个应用程序域仍加载到进程中。
  4. 我运行 procdump 并创建了一个转储文件。
  5. 将 procdump 文件加载到 Visual Studio 中,然后单击“仅使用托管进行调试”(尽管我不知道错误是否存在于托管代码中)
  6. 调试器在调用 Application_End 的线程正在等待队列完成处理的代码行处停止。通过查看变量的值,我可以得知队列不再处理项目,但我们将等到队列为空。
  7. 更改了代码并再次启动流程,这次由我对 Web 配置的更改启动的所有应用程序域都已卸载。