2010-01-21 11 views
8

Ho un pdf 5Mb sul server il download di questo file utilizzando un WriteFile mi dà un 15Mb di download, dove come la TransmitFile dà la giusta dimensione del file 5Mb ...C# Response.WriteFile vs Response.TransmitFile spazio emette

Is questo a causa di una sorta di decompressione in memoria sul server per writefile? Chiedo solo se qualcuno avesse visto la stessa cosa accade ...

(ps notato solo da quando siamo andati a IIS7 ??) Codice

essendo ...

if (File.Exists(filepath)) 
{ 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ContentType = "application/octet-stream"; 
    HttpContext.Current.Response.AddHeader("content-disposition","attachment;filename=\""+Path.GetFileName(filepath)+"\""); 
    HttpContext.Current.Response.AddHeader("content-length", new FileInfo(filepath).Length.ToString()); 

    //HttpContext.Current.Response.WriteFile(filepath); 
    HttpContext.Current.Response.TransmitFile(filepath); 

    HttpContext.Current.Response.Flush(); 
    HttpContext.Current.Response.Close(); 
} 
+0

Ho appena avuto lo stesso problema. Le impostazioni di compressione su IIS non influiscono su di esso. – geofftnz

risposta

7

TransmitFile - scrive il file specificato direttamente su un flusso di output della risposta HTTP senza memorizzarlo nella memoria.

WriteFile - scrive il file specificato direttamente a un flusso di output di risposta HTTP.

Direi che la differenza si verifica perché il file di trasmissione non tampone esso. Il file di scrittura utilizza il buffering (Afiak), in pratica tiene temporaneamente i dati prima di trasmetterli, in quanto non può indovinare la dimensione accurata del file perché è stato scritto in blocchi.

2

si può capire dalla seguente definizione.

Response.TransmitFile VS Response.WriteFile:

  • TransmitFile: Questo metodo invia il file al cliente senza caricarla nella memoria applicazione sul server. È il modo ideale per usarlo se la dimensione del file in fase di download è grande.

  • WriteFile: Questo metodo carica il file di essere caricati nella memoria del server prima di inviarlo al client. Se la dimensione del file è di grandi dimensioni, si potrebbe il processo di lavoro ASPNET potrebbe ottenere riavviato *

Riferimento: -. TransmitFile VS WriteFile