2016-05-10 8 views
1

Ist dieser Code benötigt wird, oder weil das Unload-Ereignis der Seite alle Bedienelemente auf Seite verfügt sowieso gibt es keinen Punkt in einem solchen Code zu schreiben:Soll ich FileUpload.PostedFile.InputStream absetzen?

fu.PostedFile.InputStream.Flush(); 
fu.PostedFile.InputStream.Close(); 
fu.FileContent.Dispose();  

Ich bin da auf Beispiele aus msdn fragen ich sehe, dass sie schreiben Code wie

FileUpload1.SaveAs(savePath); 

aber nicht Veranstaltung stört den Strom danach, aber auf der Hand zu entsorgen ich sehe einige Leute den Eingangsstrom nach dem Speichern explizit entsorgen?

Antwort

3

Official guidance legt nahe, dass es nicht notwendig ist, diesen Strom zu entsorgen, da sie entsorgt werden, wenn der Anforderungsverarbeitung endet:

Server-Ressourcen, die die hochgeladene Datei zugeordnet puffern zerstört werden, wenn die Anforderung endet. Verwenden Sie die SaveAs-Methode, um eine dauerhafte Kopie der Datei zu speichern.

Um dies zu untermauern Ich habe auch ein wenig Code durch die Quellen graben. Es stellt sich heraus, dass weder FileUpload noch HttpPostedFile für die Entsorgung dieses Streams verantwortlich sind. Tatsächlich enthalten sie selbst keine Ressourcen und stellen nur eine Schnittstelle bereit, um auf Teile der Anfrage zuzugreifen.

HttpRequest tut etwas entsorgung. Aber nicht alle Einwegobjekte werden entsorgt. Hier ist sein Dispose:

/* 
* Cleanup code 
*/ 
internal void Dispose() { 
    if (_serverVariables != null) 
     _serverVariables.Dispose(); // disconnect from request 

    if (_rawContent != null) 
     _rawContent.Dispose(); // remove temp file with uploaded content 
} 

Was jedoch nicht angeordnet ist, ist die Sammlung HttpRequest.Files, die der Upload-Steuerelemente Schnittstelle. Um diese Sammlung mit Daten zu füllen, wird jede veröffentlichte Datei in ein HttpPostedFile-Objekt eingeschlossen und für jede wird eine HttpInputStream erstellt. Dieses Stream-Objekt enthält den Verweis auf die gesamten Daten (siehe rawContent oben) und kennt Offset und Länge des relevanten Dateiteils. Es ist erwähnenswert, dass HttpInputStreamIDisposable implementiert, jedoch konnte ich den Code nicht finden, der diese Streamobjekte disponiert.

Um es zusammenzufassen:

  1. Hochladen Kontrollen verfügen nicht den Stream
  2. anfordern oder Httpcontext verfügen nicht den Strom entweder
  3. Jedoch Anfrage die zugrunde liegenden Daten

verfügt Es sieht so aus, als ob die Idee darin besteht, dass Verweise auf die relevanten Daten fallengelassen werden, wenn die Anfrageverarbeitung abgeschlossen ist, und sie wird entsorgt. Es wird also nicht schaden, den verwendeten Stream manuell zu löschen, aber es ist auch nicht notwendig.