Frage

Ich bin eine Datei an den Benutzer sendet eine Httphandler verwenden. Auf allen Browsern, nach dem Lesen / Download der Datei mindestens einmal, um den Browser / Anwendung auf nachfolgende Ansichten / Downloads hängt. Hier ist der Code:

    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 habe gelesen, dass Aufruf Response.Close () und Response.End () ist keine gute Idee? Haben Sie versucht beide verlassen in und das Entfernen, und es geschieht immer noch.

EDIT:

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

Ich entfernte TransmitFile und geändert Writefile, und es funktioniert jetzt einwandfrei.

context.Response.WriteFile(filePath);
context.Response.Flush();
context.Response.Close();
War es hilfreich?

Lösung

Dies kann ein bekanntes Problem sein, wenn der Server, den Sie von bist Download läuft Windows Server 2003 SP1.

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

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

Andere Tipps

Gibt es Gründe, die Sie nicht die Pufferung verwenden? Sie sind Flush () ing es, auch wenn Sie es nicht verwenden. Und ja, ich glaube, Sie sollten auch eine Response.End tun () nach dem Flush ().

Lassen Sie mich wissen, ob das funktioniert und vielleicht kann ich einige Tests meiner eigenen laufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top