Отправка файла через HttpContext приводит к зависанию браузера
-
23-08-2019 - |
Вопрос
Я отправляю файл пользователю с помощью 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().
Дайте мне знать, сработает ли это, и, возможно, я смогу провести несколько собственных тестов.