Отправка файла через HttpContext приводит к зависанию браузера

StackOverflow https://stackoverflow.com/questions/885995

Вопрос

Я отправляю файл пользователю с помощью HttpHandler.Во всех браузерах после просмотра/скачивания файла хотя бы один раз браузер/приложение при последующих просмотрах/загрузках зависает.Вот код:

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

Я читал, что вызов Response.Close() и Response.End() не является хорошей идеей?Пробовал и оставлять, и удалять, и это все равно происходит.

РЕДАКТИРОВАТЬ:

Кажется, у TransmitFile есть известные проблемы.Более подробное объяснение можно найти по адресу:http://www.improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application

Я удалил TransmitFile и заменил его на WriteFile, и теперь он работает отлично.

context.Response.WriteFile(filePath);
context.Response.Flush();
context.Response.Close();
Это было полезно?

Решение

Это может быть известной проблемой, если на сервере, с которого вы загружаете, работает Windows Server 2003 SP1.

Вот исправление: http://support.microsoft.com/kb/902780

Также проверьте, есть ли у вас OutputCache включен на странице, если да, попробуйте загрузить еще раз без него.

Другие советы

Есть ли причина, по которой вы не используете буферизацию?Вы используете Flush(), даже если вы его не используете.И да, я думаю, вам также следует выполнить Response.End() после Flush().

Дайте мне знать, сработает ли это, и, возможно, я смогу провести несколько собственных тестов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top