Sto facendo test con ASP.NET HttpHandler per scaricare un file che scrive direttamente sul flusso di risposta e non sono abbastanza sicuro sul modo in cui lo sto facendo. Questo è un metodo di esempio, in futuro, il file potrebbe essere memorizzato in un BLOB nel database:Alcune domande sulla scrittura sul flusso di risposta ASP.NET
public void GetFile(HttpResponse response)
{
String fileName = "example.iso";
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
{
Byte[] buffer = new Byte[4096];
Int32 readed = 0;
while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, readed);
response.Flush();
}
}
}
Ma, io non sono sicuro se questo è corretto o c'è un modo migliore per farlo. Le mie domande sono:
- Quando apro l'url con il browser, viene visualizzata la "Salva file" finestra ... ma sembra che il server ha iniziato già a spingere i dati nel flusso prima che faccio clic su "Salva ", è normale?
- Se rimuovo la riga "response.Flush()", quando apro l'url con il browser, ... vedo come il server web sta spingendo i dati ma la finestra di dialogo "Salva file" non viene visualizzata, (o almeno non in un tempo ragionevole) perché?
- Quando apro l'url con un oggetto WebRequest, vedo che HttpResponse.ContentLength è "-1", sebbene io possa leggere lo stream e ottenere il file. Qual è il significato di -1? Quando HttpResponse.ContentLength mostrerà la lunghezza della risposta? Ad esempio, ho un metodo che recupera un grande xml compresso con deflate come flusso binario, ma in quel caso ... quando accedo ad una WebRequest, in HttpResponse posso effettivamente vedere ContentLength con la lunghezza del flusso , perché?
- Qual è la lunghezza ottimale per l'array Byte [] che utilizzo come buffer per prestazioni ottimali in un server Web? Ho letto che è tra 4K e 8K ... ma quali fattori dovrei prendere in considerazione per prendere la decisione giusta.
- Questo metodo gonfia l'utilizzo della memoria di IIS o del client? o è in realtà il buffering del transfert correttamente?
Ci scusiamo per così tante domande, io sono abbastanza nuovo in sviluppo web: P
Cin cin.
Si dovrebbe anche dare un'occhiata alle implementazioni di HttpHandler di Boilerplate qui (http://haacked.com/archive/2005/03/17/AnAbstractBoilerplateHttpHandler.aspx) e qui (http://www.hanselman.com /blog/PermaLink,guid,5c59d662-b250-4eb2-96e4-f274295bd52e.aspx). – R0MANARMY
Il tuo modo di apprendere è apprezzato. Continua così . –
Ciò funzionerà: [http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet][1] [ 1]: http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet –