我有一个ASP.NET应用程序,它是更大系统的一部分;它从Web应用程序根级别以上的文件中读取其大部分配置。
由于已经编写了应用程序并且选择了配置文件的格式以方便客户编辑,因此我无法使用“Shared configuration files in .NET”.
中的解决方案我希望ASP.NET有一个API,我可以在启动时调用它来告诉它要监视哪个文件。 (我可以使用“FileSystemWatcher”以及捕获事件然后自己进行重新编写,但是这很可惜,因为ASP.NET已经有了监视文件的代码并在更改时重新启动。)
我还要调用什么ASP.NET API才能以一种很好的方式重启ASP.NET?
以下是我发现的一些可能有用的链接: Using the FileSystemWatcher from ASP.NET和Extending FileSystemWatcher to ASP.NET
在一种情况下,我在ASP.NET缓存中缓存了配置,并将CacheDependency设置为该文件。在需要更快访问的另一种情况下,我使用FileSystemWatcher并在配置更改时更新静态字段。
(我从来没有找到如何以合理的方式从代码重启ASP.NET。)
答案 0 :(得分:4)
如果您知道您的应用永远不会访问HttpContext之外的配置,请考虑缓存您的配置并向该文件添加CacheDependency。如果文件发生更改,则会删除缓存的配置,您可以使用更新的值重新添加它。
类似的东西:
public MyConfigObj GetConfig()
{
var config = Cache["configkey"] as MyConfigObj;
if(config == null)
{
var configPath = Server.MapPath("myconfigpath");
config = GetConfigFromFile(configPath);
Cache.Insert("configkey", config, new CacheDependency(configPath));
}
return config;
}
答案 1 :(得分:4)
static FileSystemWatcher ConfigWatcher;
static void StartWatchConfig() {
ConfigWatcher = new FileSystemWatcher("configPath") {
Filter = "configFile"
};
ConfigWatcher.Changed += new FileSystemEventHandler(ConfigWatcher_Changed);
ConfigWatcher.EnableRaisingEvents = true;
}
static void ConfigWatcher_Changed(object sender, FileSystemEventArgs e) {
HttpRuntime.UnloadAppDomain();
}
答案 2 :(得分:1)
对于第二部分,您可以使用以下代码来触发AppPool循环(与重新启动IIS相同,仅在应用程序级别而不是整个服务器上)。
using System.DirectoryServices;
public void RecycleAppPool(string machine, string appPoolName)
{
string path = "IIS://" + machine + "/W3SVC/AppPools/" + appPoolName;
DirectoryEntry w3svc = new DirectoryEntry(path);
w3svc.Invoke("Recycle", null);
}
(来自here)
答案 3 :(得分:-1)
我认为您需要创建一个使用FileSystemWatcher来监视Web应用程序目录之外的配置文件更改的服务 - 然后在检测到更改时,对Web应用程序进行非重大更改web.config文件并保存,这将重新启动应用程序。
答案 4 :(得分:-1)
也许是愚蠢的回答,但你总是可以'触摸'(添加一些空格或其他东西)你的web.config文件,这将触发重启。这是穷人的iisreset =)
(我想再次强调,这不是一般重启网站或重置IIS的理想解决方案)