L'invio di file su HttpContext provoca browser per appendere
-
23-08-2019 - |
Domanda
Io sono l'invio di un file per l'utente utilizzando un HttpHandler. Su tutti i browser, dopo aver visto / il download, almeno una volta, il browser / applicazione su successive Visto / download si blocca. Ecco il codice:
private void TransmitFile(HttpContext context, string filePath, string downloadName, bool forceDownload)
{
if (File.Exists(filePath))
{
string fileName = System.IO.Path.GetFileName(filePath);
string extension = Path.GetExtension(filePath);
FileInfo fileInfo = new FileInfo(filePath);
// set the response info/headers
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
if (forceDownload)
{
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + downloadName.Replace(" ", "_") + extension);
context.Response.BufferOutput = false;
}
string type = "";
// set known types based on file extension
if (extension != null)
{
switch (extension.ToLower())
{
case ".tif":
case ".tiff":
type = "image/tiff";
break;
case ".jpg":
case ".jpeg":
type = "image/jpeg";
break;
case ".gif":
type = "image/gif";
break;
case ".doc":
case ".rtf":
type = "Application/msword";
break;
case "pdf":
type = "Application/pdf";
break;
case "png":
type = "image/png";
break;
case "bmp":
type = "image/bmp";
break;
default:
type = "application/octet-stream";
break;
}
}
context.Response.ContentType = type;
context.Response.TransmitFile(filePath);
context.Response.Flush();
}
else
{
Immersive.Diagnostics.Log.Warn("Requested file does not exist: " + filePath, this);
Immersive.Diagnostics.Log.Warn("", this);
}
}
Ho letto che chiama Response.Close () e Response.End () non è una buona idea? Hanno provato entrambi lasciando in, e la rimozione, e succede ancora.
Modifica
Sembra che TransmitFile ha conosciuto problemi. Una spiegazione più approfondita è disponibile all'indirizzo: http: // www. improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application
Ho rimosso e cambiato TransmitFile a WriteFile, e ora funziona perfettamente.
context.Response.WriteFile(filePath);
context.Response.Flush();
context.Response.Close();
Soluzione
Questo può essere un problema noto se il server si sta scaricando da esegue Windows Server 2003 SP1.
Ecco un aggiornamento rapido: http://support.microsoft.com/kb/902780
Inoltre, verificare se è stata abilitata OutputCache
sulla pagina, in caso affermativo, riprovare il download senza di essa.
Altri suggerimenti
Qual è il motivo non lo si utilizza il buffer? Sei Flush () ing esso anche se non lo si utilizza. E sì, penso che si dovrebbe anche fare un Response.End () dopo il Flush ().
Fammi sapere se questo funziona e forse posso eseguire alcuni test della mia.