.net - ASP.Net:添加额外要监控的文件以触发 AppDomain 回收

标签 .net asp.net iis

我所有的 Asp.Net 网站都使用由 XML 文件驱动的单独配置系统,该系统负责构建整个网站使用的大量对象;一系列 uber IOC 容器可以有效地用于解决从 MVC 站点的 Controller 到后端代码的数据服务和配置对象的任何事情。

XML 构建了一堆动态方法,然后隐藏在工厂接口(interface)后面。一旦加载和构建,这些方法将不会被重建,直到应用域回收。

因此,其中一个文件的最小更改可能会对网站的功能产生深远影响,因此更新通常可以部署为简单的配置更改。这些文件可以出现在网站根目录和其中的任何子文件夹中 - 但通常不会出现在任何标准的 Asp.Net 文件夹(App_LocalResources 等)中。

但是因为文件不使用 Asp.Net/IIS 识别为“重要”的扩展名(假设扩展名是 .configfoo),如果我更改其中一个,我必须手动确保应用程序域在服务器通过:

a) 触摸 web.config 以强制重启 AppDomain;或者

b) 重新编译二进制文件

我想做的是以某种方式告诉 Asp.Net/IIS 将这些文件包含在其监视中,并将它们视为与 bin 文件夹中的 .config 文件和 .dll 一样重要;如果其中任何一个发生更改,则会触发应用程序域重新启动。

更新以回应 Artem 的回答

我试过将文件放在 bin\ 中。或在 App_LocalResources ,例如,确实重新启动了 AppDomain - 这是个好消息,但是...我不喜欢 bin\部署,因为在开发中轻松更新文件的唯一方法是进行构建(除非您手动复制/粘贴),而且它也不符合这些文件是内容的概念——它们实际上是什么,并且需要从部署的角度来看待。

同样,App_LocalResources (等)解决方案很棒,但从开发人员的角度来看并不自然 - 它是一个配置文件,因此应该能够与其他配置文件放在同一个地方(还有一个小问题,VS 似乎没有看到我的项目模板,如果我添加到此文件夹,由于其上下文相关的添加新项目对话框)。

最后,它没有解决项目可能包含的其他自由格式文件夹的问题,这些文件夹可能包含 .configfoo。文件与 asp/ascx/master/.config 文件等一起。除非我强制这些文件夹全部放在 Asp.Net 文件夹之一中,但没有人希望在 App_LocalResources 中找到页面!

结束更新

失败了 - 我记得几年前看到过一段代码,其中 FileSystemWatcher被使用,触发了 AppDomain.Unload根据其自己的基于文件的规则在站点本身内。我认为现在首选的方法是使用 System.Web.Hosting.HostingEnvironment.InitiateShutdown .

这将是我最后的手段,因为当我已经知道我想要的东西已经为其他一些扩展完成时,我会犹豫不决。

那么是否可以将其他依赖文件添加到被监视的文件中?还是我必须自己动手?

任何建议,一如既往,非常感谢

最佳答案

最后我推出了自己的。

在 Web 应用程序启动时,我设置了 FileSystemWatcher监控AppDomain.BaseDirectory及其所有带有 *.configfoo 过滤器的子文件夹.

然后我连接到引发的四个事件(创建、重命名、删除、更改),然后调用 System.Web.Hosting.HostingEnvironment.InitiateShutDown() (然后设置一个标志以防止它再次调用它,因为 FileSystemWatcher 通常会为一个文件系统操作引发多个事件)。

最后设置FileSystemWatcher.EnableRaisingEvents = true;嘿,很快。

关于.net - ASP.Net:添加额外要监控的文件以触发 AppDomain 回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5010874/

相关文章:

silverlight - ssl、silverlight、wcf 和本地安装

c# - WCF 客户端证书验证 + Windows 身份验证

asp.net - 配置错误(执行此操作时出错)

c# - 什么是好的(如果有的话).NET Windows 自动化库?

PHP 与 ASP.NET 静态变量

c# - 用户控件内联代码中的调用函数并不总是有效

c# - 如何使用 Blazor 创建表单向导?

c# - 如何先使用 DotConnect For PostgreSQL 和 Entity Framework 代码

c# - 如何在 Windows XP 的桌面右键菜单中添加项目

MySqlHelper 未将查询参数推送到 MySQL