ASP.NET, как для потоковой передачи файла пользователю - PullRequest
6 голосов
/ 10 апреля 2009

Изначально я пытался выяснить, в чем разница между Response.Close и Response.End, но после более продолжительного поиска в Google и анализа стало ясно, что я не видел распространенного способа, которым Байт [] отправляется обратно клиент. Я оставлю пример кода ниже, но я хотел бы знать, каков промышленный стандарт для этого.

Byte[] myBytes = GetReportBytes();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AppendHeader("content-length", myBytes.Length.ToString());
HttpContext.Current.Response.AppendHeader("content-Disposition", "attachment;filename=" + this.ReportFileName + GetReportExtension());
HttpContext.Current.Response.ContentType = GetApplicationContentType();
HttpContext.Current.Response.BinaryWrite(myBytes);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.Close();
//CERT FIX
//HttpContext.Current.Response.End();

1 Ответ

16 голосов
/ 10 апреля 2009

Я бы не стал звонить Response.Close() или Response.End().

Response.End() остановит выполнение / рендеринг страницы в этот момент. Код, следующий за Response.End(), не будет запущен. Ответ заканчивается в этой точке без дальнейшего вывода в поток.

Response.Close() аналогичен Response.End(), но позволяет выполнять код после его вызова (но в ответе страницы дальнейшая передача не может быть отправлена).

Response.Flush() отправит все оставшиеся элементы ответа на страницу.

От члена основной группы IIS :

Response.Close отправляет пакет сброса клиент и использовать его во всем кроме условия ошибки приведет на все виды проблем - например, если вы разговаривают с клиентом с достаточным задержка, сброс пакета может вызвать любые другие данные ответа, буферизованные на сервер, клиент или где-то в между быть отброшенным.

В данном конкретном случае сжатие включает в себя поиск общих моделей в ответ и некоторое количество ответ должен быть буферизован код сжатия для увеличения шанс найти больше повторения шаблоны - эта часть, которая буферизуется не может быть отправлено клиенту, как только вы do Response.Close ().

Короче, не используйте Response.Close ().

...