程序化AppPool回收的意外行为

时间:2016-01-06 08:46:37

标签: c# asp.net-mvc iis plugins 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();
            }
        }

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

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

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

1 个答案:

答案 0 :(得分:0)

尝试添加批处理作业以自动执行/计划删除服务器上的临时文件。然后测试应用程序池的循环。