程序化 AppPool 回收的意外行为

Unexpected behaviour of programmatic AppPool Recycle

这个学期我正在构建一个 MVC 框架站点,将用于我的看门人的自动化。其实很有趣的故事。 Git 页面:https://github.com/LarsGardien/EniacHome/tree/master/MVC_default

我决定使用可插拔架构,这样一些二年级学生就可以为这个项目创建自己的小部件,并针对他们的硬件(温度传感器和相机)调整它们。插件逻辑:http://www.codeproject.com/Articles/614767/NET-ASP-NET-MVC-plug-in-architecture-with-embedded

问题是我无法在运行时添加或删除插件程序集(/Admin/Plugin/(Add/Delete)),因为它们需要像这样添加为对项目的引用:

BuildManager.AddReferencedAssembly(asmbly) //see PluginManager.PluginInitiator

因为这是一个 PreApplicationStartMethod,所以需要重新启动应用程序。我想到了 AppPool Recycle:

ServerManager serverManager = ServerManager.OpenRemote(Environment.MachineName);
        ApplicationPool appPool = serverManager.ApplicationPools["EniacHome"];
        if (appPool != null)
        {
            if (appPool.State == ObjectState.Stopped)
            {
                appPool.Start();
            }
            else
            {
                appPool.Recycle();
            }
        }

所以这是交易:当使用 Plugin/Delete 时,应用程序在回收后重新启动(通过记录每个添加的程序集进行验证)但插件没有被删除(不是从临时文件夹中,被重新引用).再次调用删除操作时,仍然没有。但是当从 IIS 管理器调用 AppPool Recycle 时,它​​起作用了:插件被删除,应用程序启动并且 url 不再可访问。

当使用 Plugin/Add 时,新插件在回收后被引用(再次通过日志记录验证),但它的路由没有被注册。但是在 IIS 管理器回收之后,一切似乎都正常工作。

因此,虽然应用程序在以编程方式调用回收时重新启动,但它不包含正确的引用。

尝试将批处理作业添加到 automate/schedule 删除服务器上的临时文件。然后测试应用程序池的回收。