【问题标题】:Unexpected behaviour of programmatic AppPool Recycle程序化 AppPool 回收的意外行为
【发布时间】:2016-04-10 06:59:03
【问题描述】:

这个学期我正在构建一个 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 时,它​​会起作用:插件被删除,应用程序启动并且 url 不再可访问。

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

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

【问题讨论】:

标签: c# asp.net-mvc iis plugins recycle


【解决方案1】:

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

【讨论】:

  • 感谢您的提示,删除临时文件后,appPool 回收工作。虽然这是一个重量级的解决方案。就我而言,这很好,但欢迎使用更快速的解决方案。无论如何,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2015-05-13
相关资源
最近更新 更多