【发布时间】: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