如何更新IIS和ASP.NET上的共享文件?

如何更新IIS和ASP.NET上的共享文件?,asp.net,iis-6,download,Asp.net,Iis 6,Download,我们正在替换一个“旧”的web应用程序(最初的CodeCentral是10年前编写的,现在运行在,提供了超过1270万的服务),它使用基于文件的缓存来提供下载服务。web应用程序管理此文件缓存 使用基于文件的下载唯一复杂的一点是更新可能被其他版本使用的文件。当我编写CodeCentral的原始delphicgi版本时,我隐约记得能够重命名现有文件,即使有人正在下载它,用正确的名称编写新文件,并最终清理旧文件 然而,我可能有点妄想,因为我们当前的IIS 6和ASP.NET 2.x或3.x代码不适用

我们正在替换一个“旧”的web应用程序(最初的CodeCentral是10年前编写的,现在运行在,提供了超过1270万的服务),它使用基于文件的缓存来提供下载服务。web应用程序管理此文件缓存

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

然而,我可能有点妄想,因为我们当前的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下载的文件。有吗?

约翰,你能再解释一下情况吗

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


也许这会有点帮助。

我想我们将用以下逻辑来解决这个问题:

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

这样,在查找“[id].zip”之前,我们总是先查找“[id].[modified].zip”来确保最新的文件,并且在最终替换“标准”[id].zip”版本之前,我们可以根据需要和在后台轻松地实现清理例程,即使有多个修改版本


当然,这只适用于存储上次修改文件的时间,但是任何使用这种技术的系统都应该这样做。

谢谢您的提问,Greg。这些是大文件,500MB或更大。此外,它们不是临时文件,而是有时需要更新的文件。大多数文件不会更改,但当它们更改时,我们需要确保可以用新版本替换它们。你的问题促使我再次思考这个问题——也许我们可以在文件中嵌入一个版本戳,并以这种方式解决它。