ASP.NET FileSystemWatcher Измененное событие - PullRequest
0 голосов
/ 14 февраля 2012

Я создал сайт ASP.NET с Visual Studio 2010 C #.

Моя программа читает конфигурационный файл для создания некоторых классов и отображения информации.

Файл конфигурации не включен в проект (не отображается в обозревателе решений). Если я изменяю файл, когда мое приложение не запущено, и запускаю его впоследствии, он все равно читает старую версию, как будто хранит ее в кэше. Я должен закрыть Visual Studio, чтобы он принял изменения.

Моя вторая проблема связана (если не вызвана) с моей первой проблемой. Я использую FileSystemWatcher, чтобы увидеть, был ли изменен файл конфигурации во время работы приложения, но событие Changed никогда не вызывалось.

private string _configFilePath;
private FileSystemWatcher _watcher;

protected void Page_Load(object sender, EventArgs e)
{
    //Gets the config file in the application's parent directory
    string appPath = this.MapPath("~");
    string[] split = appPath.Split('\\');
    _configFilePath = appPath.Substring(0, appPath.Length - split[split.Length-1].Length);

    Application.Add("watcher", new FileSystemWatcher(_configFilePath.Substring(0, _configFilePath.Length-1), "*.xml"));
    _watcher = (FileSystemWatcher)Application["watcher"];
    _watcher.NotifyFilter = NotifyFilters.FileName;
    _watcher.Changed += new System.IO.FileSystemEventHandler(Watcher_Changed);

    _configFilePath += "ProductsConfig.xml";

    UpdateDisplay();
}

private void Watcher_Changed(object source, FileSystemEventArgs e)
{
    UpdateDisplay();
}

Как я могу решить эту проблему?

Спасибо

Ответы [ 2 ]

4 голосов
/ 14 февраля 2012

Моя вторая проблема связана (если не вызвана) с моей первой проблемой.Я использую FileSystemWatcher, чтобы увидеть, был ли изменен файл конфигурации во время работы приложения, но событие Changed никогда не вызывается.

Никогда не вызывается, потому что в этот момент поток, обслуживающий запрос, ужевернулся в пул и запрос закончился.Событие Watcher_Changed никогда не сработает.

Вам нужно решить это по-другому, помните, что HTTP - это «отключенный» протокол, после того как запрос был обработан, не ожидайте ни одной страницысобытия запускаются «автоматически», когда на стороне сервера происходит что-то, что уведомляет всех подключенных пользователей.

Один из способов сделать это - через Ajax.Вам необходимо постоянно «спрашивать» сервер, есть ли новая информация или нет, и обновлять разделы страницы, которые необходимо обновить в результате изменений на сервере.

0 голосов
/ 14 февраля 2012

Здесь есть 2 проблемы.1. Вы никогда не вызывали _watcher.EnableRaisingEvents = true;2. Вы пытаетесь перейти в родительскую папку своей корневой папки, что может быть запрещено.

/ Tibi

...