我跟着this tutorial在我的ASP.NET WCF服务(在IIS服务器上运行)中安排了一个FileSystemWatcher任务,以允许热配置更改。这是我在教程中描述的实现版本......
// FileSystemWatcher declaration
private static FileSystemWatcher s_configWatcher = new FileSystemWatcher()
{
Path = HttpRuntime.AppDomainAppPath,
NotifyFilter = NotifyFilters.LastWrite,
Filter = "Web.config"
};
...
// inside non-static constructor of FileSystemWatcher's owner
s_configWatcher.Changed += OnConfigChange;
s_configWatcher.EnableRaisingEvents = true;
...
// this has been modified to debug the problem in question
static void OnConfigChange(object source, FileSystemEventArgs args)
{
try
{
string oldValue = ConfigurationManager.AppSettings[myKey];
s_configWatcher.EnableRaisingEvents = false;
ConfigurationManager.RefreshSection("appSettings");
string newValue = ConfigurationManager.AppSettings[myKey];
Tools.LogConfigChange(oldValue, newValue);
}
catch (Exception e)
{
Tools.LogException(e);
}
finally
{
s_configWatcher.EnableRaisingEvents = true;
}
}
请注意,我没有像在教程中那样使用专用线程来实例化FileSystemWatcher ......我不明白你买的是什么。
所以,奇怪的是,这个FileSystemWatcher似乎错过了在不活动期间发生的配置更改。
我的服务有一个status-check
端点,用于强制活动......
public Stream StatusCheck()
{
Tools.LogStatusCheck();
return Tools.SerializeObject(new StatusCheckResponse { Success = true });
}
为了完整性,这是我的(Log4Net)日志功能...
public static void LogStatusCheck()
{
log.Debug("Status check. Current value: " + ConfigurationManager.AppSettings[SessionManager.s_prodDbLimitKey]);
}
public static void LogConfigChange(string oldValue, string newValue)
{
log.Debug("Old value: " + oldValue + Environment.NewLine + "New value: " + newValue);
}
public static void LogException(Exception e)
{
log.Debug(e.ToString());
}
鉴于以下工作流程......
Start service
Touch status-check endpoint
Change config value from 200 to 201
Touch status-check endpoint
Change config value from 201 to 202
Change config value from 202 to 203
Touch status-check endpoint
Change config value from 203 to 204
Touch status-check endpoint
Change config value from 204 to 205
Change config value from 205 to 206
Touch status-check endpoint
Change config value from 206 to 207
Stop service
以下是我在日志中看到的内容......
10:04:44-05:00
Status check. Current value: 200
10:04:51-05:00
Old value: 200
New value: 200
10:04:54-05:00
Status check. Current value: 201
10:04:58-05:00
Old value: 201
New value: 201
10:05:05-05:00
Status check. Current value: 203
10:05:10-05:00
Old value: 203
New value: 203
10:05:12-05:00
Status check. Current value: 204
10:05:16-05:00
Old value: 204
New value: 204
10:05:22-05:00
Status check. Current value: 206
10:05:27-05:00
Old value: 206
New value: 206
FileSystemWatcher 不不仅会获取活动期间发生的配置更改,而且日志中的旧配置值和新配置值也相同。当我查看调试器中的内容时,我发现值实际上是不同的(我期望它们是什么),但是它们仍然被写出来记录为相同的值。
当我开始调查此问题时,我遇到了this answer一个看似相似的问题,但是将应用程序池的启动模式更改为AlwaysRunning似乎对此问题没有任何影响。
对于我的生活,我无法弄清楚发生了什么。我的老板和我一起看着这个问题,他似乎同样陷入困境。我在配置FileSystemWatcher的方式上做错了吗?有没有人在ASP.NET WCF服务中有任何计划任务的经验?任何帮助或见解将不胜感激。