2009-04-23 6 views
3

Wir ersetzen eine "alte" Webanwendung (das ursprüngliche CodeCentral wurde vor über 10 Jahren geschrieben und läuft jetzt unter http://cc.embarcadero.com mit über 12,7 Millionen Angeboten), das einen dateibasierten Cache für die Bereitstellung von Downloads verwendet. Die Webanwendung verwaltet diesen Dateicache.Wie aktualisiere ich eine freigegebene Datei auf IIS und ASP.NET?

Das einzige komplizierte Bit bei der Verwendung dateibasierter Downloads ist das Aktualisieren einer Datei, die möglicherweise von einer anderen Version verwendet wird. Als ich die ursprüngliche Delphi-CGI-Version von CodeCentral geschrieben habe, erinnere ich mich vage daran, dass ich die vorhandene Datei umbenennen konnte, obwohl jemand sie heruntergeladen hat, die neue Datei mit dem richtigen Namen geschrieben und schließlich die alte Datei aufgeräumt hatte.

Allerdings kann ich wahnhaft sein, weil das nicht mit unserem aktuellen IIS 6 und ASP.NET 2.x oder 3.x-Code funktioniert. Also, was wir haben dies stattdessen ist getan, was ziemlich kludgy ist aber schließlich funktioniert:

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); 
    } 
    } 
} 

Ich denke, wir sind etwas fehlt einfach und es muss einen besseren Weg geben, eine Datei zur Zeit zu ersetzen ist heruntergeladen über IIS und ASP.NET. Ist da?

Antwort

2

Ich denke, wir werden dies mit der folgenden Logik lösen:

Wir speichern die Datum/Uhrzeit eine Datei aktualisiert wird. Wenn wir den datengetriebenen Dateinamen "[id] .zip" nicht aktualisieren können, erstellen wir stattdessen "[id] _ [modified] .zip" und verwenden dies, bis wir es umbenennen können "[id] .zip" durch Löschen der älteren Version der Datei.

Auf diese Weise sind wir immer sicher, dass die neueste Datei zuerst nach "[id] _ [modified] .zip" sucht, bevor Sie nach "[id] .zip" suchen. up Routine sowohl bei Bedarf als auch im Hintergrund, auch wenn es mehrere modifizierte Versionen gibt, bevor wir die "standard" "[id] .zip" Version endlich ersetzen können.

Natürlich funktioniert dies nur, wenn Sie das letzte Mal speichern, die Datei geändert wurde, aber jedes System mit dieser Art von Technik sollte sowieso.

0

John, Könnten Sie ein bisschen mehr Licht auf die Situation werfen?

Wenn die Dateien klein genug sind, können Sie die gesamte Datei in den Speicher laden und dann an den Client senden.

Vielleicht hilft das blog post about downloading and deleting temporary files ein wenig.

+1

Danke für die Nachfrage, Greg. Dies sind große Dateien, 500 MB oder mehr. Außerdem handelt es sich nicht um temporäre Dateien, sondern um Dateien, die manchmal aktualisiert werden müssen. Die meisten Dateien ändern sich nicht, aber wenn sie dies tun, müssen wir sicher sein, dass wir sie durch eine neue Version ersetzen können. Ihre Frage veranlasste mich, noch einmal darüber nachzudenken - vielleicht können wir einen Versionsstempel in die Datei einbetten und so lösen. –

Verwandte Themen