ASP.NET Как передать файл пользователю

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

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

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

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

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

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

Из Основной участник IIS:

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

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

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