2009-07-18 11 views
5

Sto caricando file di grandi dimensioni su un server ASP.NET utilizzando un controllo HTML standard <input> che registra i dati in formato multipart. Questa è un'applicazione ASP.NET MVC.Perché HttpPostedFile non funziona come pubblicizzato e il buffer viene scaricato sul disco anziché sulla memoria?

Secondo MSDN, i HttpPostedFile buffer di classe su disco fuori dalla scatola:

"i file vengono caricati in MIME multipart/formato form-data Per impostazione predefinita, tutte le richieste, compresa la forma campi. e file caricati, più grandi di 256 KB sono memorizzati su disco, piuttosto di quelli conservati nella memoria del server. "

Presumo che ciò significa che quando accedo HttpPostedFileBase nel mio controller, che quando accedo InputStream proprietà s' il HttpPostedFileBase, posso scrivere il buffer di file da qualche parte, senza doversi preoccupare di server esaurimento della memoria, che è ovviamente una soluzione impraticabile.

Ecco un po 'di pseudocodice per come gestisco ciascuno dei file in arrivo da HttpPostedFileBase.

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

blocco httpRuntime del mio web.config si presenta così:

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

mie opere di implementazione, più file vengono caricati come previsto, salvo che la stessa quantità di memoria necessaria per tamponare l'intero carico utile è consumato dal server. Devo supporre che InputStream stia tamponando tutto. Quando carico più file di quanti ne disponga, si blocca in modo prevedibile con uno OutOfMemoryException. Ecco un'immagine del picco di memoria durante il caricamento di un file 800mb.

alt text

So che potrei usare un widget Flash/Silverlight o scrivere una consuetudine HttpModule per intercettare arrivi e gestire io stesso, ma l'attuale requisito potrebbe funzionare senza problemi se HttpPostedFile fatto quello MSDN dice che fa (o io sto sbagliando)

risposta

5

perché si fa a impostare

requestLengthDiskThreshold="2097151" 

nella configurazione? Ciò non costringe il server a mantenere tutti i caricamenti nella RAM anziché il buffering su disco?

+0

Naturalmente. Stavo eseguendo il debug di un altro aspetto del caricamento e l'ho impostato senza pensarci. Impostandolo su 256kb mantiene la memoria del server a cui appartiene. Grazie! –

+0

@DanielCrenna impostandolo su 256kb puoi caricare con successo? Per favore rispondi. –

Problemi correlati