Thomas Bandt

Über mich | Kontakt | Archiv

(Große) Dateien mit ASP.NET elegant zum Client streamen

Ich hatte mich zum Thema vor einem Jahr bereits ausgelassen und in den Kommentaren Kritik eingesteckt, berechtigt. Da ich das aber in einem Projekt bis heute nicht geändert hatte und man ja schnell mal Kleinigkeiten im Eifer des Gefechts mit Copy&Paste übernimmt, musste ich diese falsche Vorgehensweise damit bezahlen, dass ich sogar den Webserver abschießen musste.

Was war passiert? Das was passieren musste. Ein Download-Portal mit sehr großen Dateien, ein Mailing an die Kunden und ein Download-Handler, der die zu ladenden Dateien in den Speicher schreibt und das auch noch in einem Rutsch. Irgendwann stand der Application Pool dann bei 7 Gigabyte RAM und das war's dann ...

Lange Rede kurzer Sinn: bei der neuerlichen Recherche bin ich über eine Methode im Response-Objekt gestoßen, die ich bisher völlig übersehen hatte und die das Problem sehr elegant löst: Response.TransmitFile().

Aus der MSDN: "Writes the specified file directly to an HTTP response output stream without buffering it in memory."

Ressourcen-schonender kann man wahrlich kaum arbeiten.

Kommentare

  1. Peter Bucher schrieb am Montag, 13. Juli 2009 13:32:00 Uhr:

    Hoi Thomas

    Hast du dort schon mit .NET 2.0 gearbeitet?

    Die Methode ist super, wenn man einen Dateipfad hat und nicht komplette Kontrolle braucht.
    So wie ich das sehe wird die Buffergrösse automatisch vom System festgelegt.

    Ansonsten könnte man selber eine Buffergrösse festlegen, direkt mit Streams arbeiten und auch abfangen wann der Download erfolgreich war oder eben nicht. Das lohnt sich allerdings nur, wenn man das braucht :-).
  2. Thomas schrieb am Montag, 13. Juli 2009 13:36:00 Uhr:

    Ja, ist 2.0. Selbst streamen kann man klar auch, aber dann sollte man es eher so machen wie im Kommentar zum verlinkten Post geschrieben und nicht wie von mir damals empfohlen ;-).

    In dem Fall brauche ich von alldem nichts, die Files kommen per FTP hoch und werden einfach nur runtergeladen, ohne Auswertungen o.ä. - da geht's nur über den Handler, weil die Authentifizierung geprüft werden muss.
  3. Michael Schwarz schrieb am Dienstag, 14. Juli 2009 08:52:00 Uhr:

    Und ich habe immer Response.WriteFile verwendet.


« Zurück  |  Weiter »