2009-05-20 7 views
1

Ich sende eine Datei mit einem HttpHandler an den Benutzer. In allen Browsern, nachdem die Datei mindestens einmal angezeigt/heruntergeladen wurde, bleibt der Browser/die Anwendung bei nachfolgenden Ansichten/Downloads hängen. Hier ist der Code:Das Senden einer Datei über HttpContext führt dazu, dass der Browser hängt

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

ich gelesen habe, dass Aufruf Response.Close() und Response.End() ist keine gute Idee? Habe versucht, sowohl reinzugehen, als auch zu entfernen, und es passiert immer noch.

EDIT:

Es scheint, dass TransmitFile Probleme bekannt. Eine ausführlichere Erklärung finden Sie unter: http://www.improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application

Ich entfernte TransmitFile und änderte zu WriteFile, und es funktioniert jetzt perfekt.

context.Response.WriteFile(filePath); 
context.Response.Flush(); 
context.Response.Close(); 

Antwort

0

Dies kann ein bekanntes Problem sein, wenn auf dem Server, von dem Sie herunterladen, Windows Server 2003 SP1 ausgeführt wird. Hier

ist ein Hotfix: http://support.microsoft.com/kb/902780

Überprüfen Sie auch, wenn Sie OutputCache auf der Seite aktiviert haben, wenn ja, versuchen Sie den Download erneut ohne sie.

0

Gibt es einen Grund, warum Sie die Pufferung nicht verwenden? Du bist Flush(), obwohl du es nicht benutzt. Und ja, ich denke du solltest auch eine Response.End() nach dem Flush() machen.

Lassen Sie mich wissen, ob das funktioniert und vielleicht kann ich einige Tests selbst durchführen.

+0

BufferOutput wurde auf true geändert und End() hinzugefügt. Immer noch keine Würfel. – mickyjtwin

Verwandte Themen