Мы заменяем «старое» веб-приложение (оригинальный 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. Есть ли?