ASP.NET WCF服务中的FileSystemWatcher任务表现奇怪且不可靠

时间:2015-03-06 15:44:07

标签: c# asp.net .net wcf filesystemwatcher

我跟着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服务中有任何计划任务的经验?任何帮助或见解将不胜感激。

0 个答案:

没有答案