Как обновить общий файл в IIS и ASP.NET? - PullRequest
3 голосов
/ 23 апреля 2009

Мы заменяем «старое» веб-приложение (оригинальный CodeCentral был написан более 10 лет назад и сейчас работает на http://cc.embarcadero.com с более чем 12,7 млн. Обслуживаемых), которое использует файловый кэш для обслуживания загрузок. Веб-приложение управляет этим файловым кешем.

Единственное сложное использование файловых загрузок - это обновление файла, который может использоваться другой версией. Когда я писал исходную версию 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. Есть ли?

Ответы [ 2 ]

2 голосов
/ 03 июня 2009

Я думаю, что мы собираемся решить эту проблему с помощью следующей логики:

Мы храним дату / время обновления файла. Если мы не сможем обновить управляемое данными имя файла «[id] .zip», мы вместо этого создадим «[id] _ [ified] .zip» и будем использовать его, пока не сможем переименовать его в «[id] .zip», удалив старую версию файла.

Таким образом, мы всегда уверены в последнем файле, сначала ищем «[id] _ [Modified] .zip», прежде чем искать «[id] .zip», и мы можем легко выполнить очистку подпрограмма как по требованию, так и в фоновом режиме, даже если есть несколько измененных версий, прежде чем мы сможем наконец заменить «стандартную» версию «[id] .zip».

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

0 голосов
/ 02 июня 2009

Джон, не могли бы вы пролить немного света на ситуацию?

Если файлы достаточно малы, вы можете загрузить весь файл в память, а затем отправить его клиенту.

Может быть, это сообщение в блоге о загрузке и удалении временных файлов немного поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...