2009-07-18 3 views
5

Ich lade große Dateien auf einen ASP.NET-Server mit einem Standard-HTML-Steuerelement <input> Multipart-Formular Daten. Dies ist eine ASP.NET MVC-Anwendung.Warum führt HttpPostedFile nicht wie angekündigte und Puffer-Downloads auf Festplatte statt Speicher aus?

Laut MSDN, die HttpPostedFile Klasse Puffer auf die Festplatte aus der Box:

„Die Dateien werden in MIME mehrt hochgeladen/form-Datenformat von standardmäßig alle Anforderungen, einschließlich Formular Felder aus. und hochgeladene Dateien, größer als 256 KB sind auf Festplatte gepuffert, eher als im Serverspeicher gehalten. "

gehe ich davon aus bedeutet dies, dass, wenn ich HttpPostedFileBase in meinem Controller zugreifen, dass, wenn ich die HttpPostedFileBase ‚s InputStream Eigenschaft zugreifen, ich aus der Erinnerung kümmern, ohne sich um den Server ausgeführt wird, die Datei Puffer irgendwo schreiben kann, die ist offensichtlich eine nicht praktikable Lösung.

Hier ist ein bisschen Pseudocode für, wie ich jede der eingehenden Dateien von handhabe.

for(var i = 0; i< Request.Files.Count;i++) 
{ 
    var fileBase = Request.Files[i]; 
    if (fileBase.ContentLength == 0) 
    { 
     continue; 
    } 

    // One thread per file 
    ThreadPool.QueueUserWorkItem(state => 
    { 
     // Read from fileBase.InputStream 
    }, 
    null); 
} 

Httpruntime Block Meine web.config der wie folgt aussieht:

<httpRuntime 
    executionTimeout="1200" 
    requestLengthDiskThreshold="2097151" 
    maxRequestLength="2097151" 
    useFullyQualifiedRedirectUrl="false" 
    minFreeThreads="8" 
    minLocalRequestFreeThreads="4" 
    appRequestQueueLimit="100" /> 

Meine Implementierung Arbeiten werden mehrere Dateien wie erwartet hochgeladen, mit der Ausnahme, dass die gleiche Menge an Speicher benötigt, um die gesamte Nutzlast zu puffern verbraucht wird vom Server. Ich muss annehmen, dass der InputStream alles zwischenspeichert. Wenn ich mehr Dateien hochlade als ich Speicher habe, stürzt es vorhersehbar mit einer OutOfMemoryException ab. Hier ist ein Bild des Memory-Spikes beim Hochladen einer 800-MB-Datei.

alt text

Ich weiß, dass ich ein Flash/Silverlight-Widget nutzen könnte oder einen benutzerdefinierten schreiben HttpModule Uploads abzufangen und sie selbst zu behandeln, aber die aktuelle Anforderung würde einwandfrei funktionieren, wenn HttpPostedFile tun, was MSDN sagt, es tut (oder ich mache es falsch.

Antwort

5

warum tun Sie

requestLengthDiskThreshold="2097151" 

in der Konfiguration festgelegt? Zwingt das den Server nicht, alle Uploads im RAM zu behalten, statt auf Festplatte zu puffern?

+0

Natürlich. Ich debugging einen anderen Aspekt des Hochladens und setze das ohne nachzudenken. Wenn Sie es auf 256 KB einstellen, bleibt der Serverspeicher dort, wo er hingehört. Vielen Dank! –

+0

@DanielCrenna durch Einstellung auf 256kb können Sie erfolgreich hochladen? Bitte antworten Sie. –

Verwandte Themen