当配置更改时,.Net应用程序自动重启

6

当应用程序的任何部分配置更改时,我必须完全重新启动它。 IIS会尽力监视asp.net应用程序中的配置更改,但是对于像控制台或服务等应用程序,我该如何重启呢?

使用FileSystemWatcher监视配置文件更改并启动新应用程序实例、关闭当前应用程序是否可行?

类似于:

    var file = new FileInfo(AppDomain.CurrentDomain.
SetupInformation.ConfigurationFile);

    var watcher = new FileSystemWatch(file.Directory.FullName)
                      { 
                          Filter = "...", 
                          NotifyFilter = NotifyFilter.LastWrite }
                      );

    watcher.Changed += .. // Process.Start(..), current process shutdown 
    watcher.EnableRaisingEvents = true;
4个回答

2
您可以将实际应用逻辑放在一个单独的AppDomain中运行。初始(或默认)AppDomain仅用于(a)使用文件系统监视器启动线程和(b)在单独的AppDomain中启动应用程序逻辑。关键是,创建AppDomain时可以传递配置文件的路径。当您发现配置文件发生更改时,停止应用程序逻辑(在您的情况下意味着什么 - 这是真正棘手的部分!),卸载AppDomain,然后重新启动它,这将使用更新的配置文件。

1

据我所知,.NET 的标准应用程序配置不允许动态更新。但如果我是你,我宁愿编写自己的应用程序配置类,该类读取 xml 或其他配置文件,监视此配置文件的更改,如果有更改,则重新加载配置文件。如果可能的话,这应该比杀死和启动新进程更加优雅。

如果您的应用程序可以被多次调用(在启动新进程时有两个实例)并且可以停止,并且配置更改相对不频繁,则您的方法应该没有任何缺点。我不知道您是否可以随意启动 Windows 服务。


谢谢你的建议,Matten。但是我的配置文件并不能帮我关闭应用程序(释放它所拥有的所有资源,而不仅仅是更新配置数据)。 - Andrew Florko

1

当调试器记住 Visual Studio 启动的是 XXX.vshost.exe 而不是 XXX.exe 时,你需要在调试时观察不同的文件。

FileSystemWatch 是简单的部分,你需要使用第二个应用程序域来运行主应用程序或者有一个“启动器”应用程序,或者让你的应用程序在需要重新启动时调用 Process.Start()。错误检查是使这个过程变得困难的原因...


1

我不确定Asp.net,但也许你可以在不同的AppDomain中加载应用程序,当配置更改时重新加载该域。这将基本上使用新设置重新初始化您的应用程序。

以下是如何进行的:

            AppDomainSetup setup = new AppDomainSetup()
            {
                ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
                // ... maybe more options can go here, inspect the class and see your options
            };

            domain = AppDomain.CreateDomain("MyDomainName", null, setup);
            domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
            MyApplication app = (MyApplication)domain.CreateInstanceFromAndUnwrap("assemblyfilename.dll", "The_Type_Name.MyApplication" );
            app.Launch();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接