Отправка файла через HttpContext приводит к зависанию браузера - PullRequest
1 голос
/ 20 мая 2009

Я отправляю файл пользователю, используя 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 () не очень хорошая идея? Попробовал как уйти, так и удалить, и это все еще происходит.

EDIT:

Похоже, что 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();

Ответы [ 2 ]

0 голосов
/ 20 мая 2009

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

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

Кроме того, проверьте, включен ли на странице OutputCache, если это так, попробуйте загрузить его снова без него.

0 голосов
/ 20 мая 2009

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

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

...