【问题标题】:Only allow one server to access a file on a network drive只允许一台服务器访问网络驱动器上的文件
【发布时间】:2008-10-21 05:08:20
【问题描述】:

我有一个运行在多个 IIS 服务器上的应用程序,它需要解析一个放在公共网络驱动器上的 CSV 文件。如果我在文件可用时使用System.IO.FileSystemWatcher Created event 通知事件,如何确保只有一台服务器解析文件?如果所有服务器都收到此更改的通知,所有服务器都将尝试解析它。第一台服务器是否应该在本地复制它然后解析它?这会导致其他服务器上的错误吗?我应该将远程目录访问权限设置为只允许一台服务器读取访问权限吗?

文件包含需要插入共享数据库的记录,但记录没有唯一键。因此,如果多台服务器同时抓取文件并插入记录,数据库中就会出现重复。

【问题讨论】:

  • 也许改变标题会帮助问题得到更多关注? IIS 和 FileSystemWatcher 确实与核心问题无关,我建议将它们排除在外。

标签: c# file-io networking


【解决方案1】:

关键问题是:当他们几乎同时尝试解析文件时,是否会发生不好的事情?文件系统级别基本上允许多次读取访问,因此仅此事实不一定会破坏任何内容。

我可能会尝试在第一次文件访问时创建锁定文件的方法,并让服务器在访问文件之前查找锁定文件。完成后删除锁定文件。

您也可以在文件上设置排他锁,一次只能有一台服务器执行此操作。其他人将无法尝试:

FileStream fs = new FileStream(
  FilePath, 
  FileMode.Open,
  FileAccess.ReadWrite, 
  FileShare.None
);

【讨论】:

    【解决方案2】:

    替代锁定的另一个选项是将文件重命名为目录。为每个服务器创建一个子目录,然后让服务器尝试将文件重命名到其目录中(重命名是原子操作)。成功者解析文件。

    锁定问题会很棘手,因为每个服务器仍然可以看到该文件,并且他们可能会尝试打开该文件,然后重复出错。重命名对于文件的所有者来说是绝对的。

    还请记住,无论您使用何种解决方案,都可能会出现“丢失文件”。如果服务器停止处理文件(错误、异常、重新启动...),它可能会被放弃。这些类型问题的典型解决方案是除了诸如文件观察器之类的东西之外,您还让服务器不时地轮询。

    将文件复制到服务器目录将对此有所帮助。一个缺点是如果服务器完全脱机,那么它的文件将位于一个目录中,直到服务器重新联机。

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多