【问题标题】:ASP.NET FileSystemWatcher Changed EventASP.NET FileSystemWatcher 更改事件
【发布时间】:2012-02-13 21:14:40
【问题描述】:

我使用 Visual Studio 2010 C# 创建了一个 ASP.NET 网站。

我的程序读取一个配置文件来创建一些类并显示信息。

配置文件未包含在项目中(未出现在解决方案资源管理器中)。如果我在应用程序未运行时修改文件,然后再运行它,它仍会读取旧版本,就像将其保存在缓存中一样。我必须关闭 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();
}

我该如何解决这个问题?

谢谢

【问题讨论】:

    标签: c# asp.net xml web filesystemwatcher


    【解决方案1】:

    我的第二个问题与(如果不是由)我的第一个问题有关。一世 正在使用 FileSystemWatcher 查看配置文件是否被修改 应用程序正在运行,但从未调用 Changed 事件。

    它永远不会被调用,因为此时为请求提供服务的线程已经返回到池中并且请求已经结束。 Watcher_Changed 事件永远不会触发。

    您需要以不同的方式解决此问题,请记住 HTTP 是一个“断开连接”协议,在处理请求后,不要期望任何页面事件在服务器上发生某些事情时“自动”触发将通知所有连接的用户的一侧。

    一种方法是通过 Ajax。您需要不断地“询问”服务器是否有新信息,并更新由于服务器更改而需要更新的页面部分。

    【讨论】:

    • 好的,我会尝试改变我的策略。我可以尝试进行定期池来检查文件的修改日期并在修改后刷新吗?另外,为什么我必须继续关闭我的解决方案(当我停止应用程序时)才能读取文件中的修改?
    • @Amaranth Could I try to do a periodical pooling to check the modified date of the file and refresh if it was modified? 是的,这就是我的建议。如果您在每个请求(或您有任何要求)上阅读文件,您应该能够在不重新启动应用程序的情况下获取更改。它现在不起作用的原因是因为您只读取了一次文件。
    • 我刚刚完成了 Ajax 计时器的实现,并且每 1.5 秒正确触发一次刷新事件。它检查修改的时间并将其与之前的时间进行比较。如果之后被修改,则再次读取该文件。但是,当再次读取文件时,收到的不是新数据,而是由于某种原因我仍然读取旧文件...我的应用程序是否将文件保留在缓存中?
    • @Amaranth 这就是它的样子......如果可以的话,发布读取文件的代码。
    • 因为我自己的愚蠢而无法正常工作...为了刷新网格,我调用了我的 ProductsConfig 的实例,它是一个单例,因此该文件再也没有被读取过。 . 计时器修复了原始问题,我修改了 ProductsConfig 以在必要时读取。非常感谢您的帮助。
    【解决方案2】:

    这里有两个问题。 1. 你从来没有调用 _watcher.EnableRaisingEvents = true; 2.您尝试转到根文件夹的父文件夹,这可能是不允许的。

    /提比

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多