【问题标题】:How do I update a shared file on IIS and ASP.NET?如何更新 IIS 和 ASP.NET 上的共享文件?
【发布时间】:2009-04-23 05:11:12
【问题描述】:

我们正在替换使用基于文件的缓存来提供下载的“旧”网络应用程序(最初的 CodeCentral 是 10 多年前编写的,现在在 http://cc.embarcadero.com 运行,提供了超过 1270 万次服务)。 Web 应用程序管理此文件缓存。

使用基于文件的下载唯一复杂的一点是更新可能被另一个版本使用的文件。当我编写 CodeCentral 的原始 Delphi CGI 版本时,我隐约记得能够重命名现有文件,即使有人可能正在下载它,用正确的名称编写新文件,并最终清理旧文件。

但是,我可能会产生错觉,因为这不适用于我们当前的 IIS 6 和 ASP.NET 2.x 或 3.x 代码。所以,我们所做的是这个,虽然很笨拙,但最终会奏效:

public static void FileCreate(Stream AStream, string AFileName, int AWaitInterval)
{
  DateTime until = DateTime.Now.AddSeconds(AWaitInterval);
  bool written = false;
  while (!written && (until > DateTime.Now))
  {
    try
    {
      using (FileStream fs = new FileStream(AFileName, FileMode.Create))
      {
        CopyStream(AStream, fs);
        written = true;
      }
    }
    catch (IOException)
    {
      Thread.Sleep(500);
    }
  }
}

我认为我们缺少一些简单的东西,必须有更好的方法来替换当前通过 IIS 和 ASP.NET 下载的文件。有吗?

【问题讨论】:

    标签: asp.net iis-6 download


    【解决方案1】:

    我认为我们将使用以下逻辑解决此问题:

    我们存储文件更新的日期/时间。如果我们无法更新数据驱动文件名“[id].zip”,我们将创建“[id]_[modified].zip”,并使用它,直到我们能够将其重命名为“[id].zip”通过删除旧版本的文件。

    这样,在查找“[id].zip”之前先查找“[id]_[modified].zip”,我们始终可以确保获得最新文件,并且我们可以轻松实现清理即使有多个修改版本,我们也可以在最终替换“标准”“[id].zip”版本之前进行按需和后台例程。

    当然,这仅在您存储上次修改文件的时间时才有效,但任何使用这种技术的系统无论如何都应该这样做。

    【讨论】:

      【解决方案2】:

      约翰,您能否进一步说明情况?

      如果文件足够小,您可以将整个文件加载到内存中,然后将其发送到客户端。

      也许这个blog post about downloading and deleting temporary files 会有所帮助。

      【讨论】:

      • 感谢您的提问,格雷格。这些是大文件,500MB 或更多。此外,它们不是临时文件,而是有时需要更新的文件。大多数文件不会更改,但是当它们发生更改时,我们需要确保可以将它们替换为新版本。你的问题促使我重新考虑这个问题——也许我们可以在文件中嵌入版本标记并以这种方式解决。
      猜你喜欢
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2013-03-18
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多