编程AppPool回收的意外行为
本文关键字:意外 AppPool 编程 | 更新日期: 2023-09-27 18:29:11
本学期,我正在构建一个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回收:
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管理器回收后,一切似乎都正常工作。
因此,尽管该应用程序在以编程方式调用回收时会重新启动,但它并不包括正确的引用。
尝试添加一个批处理作业来自动/计划删除服务器上的临时文件。然后测试应用程序池的回收。