Обязательно ли Response.End() в данном сценарии?

string filePath = ExportAndSaveInvoiceAsHtml(invoiceId);      

Response.AddHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName(filePath));

Response.WriteFile(filePath);

// Using Response.End() solves the problem
// Response.End();

Я хочу, чтобы пользователи могли загружать HTML-счета (из gridView счетов-фактур). Полученный файл содержит данные файла счета-фактуры + нежелательные HTML страницы.

Если я использую Response.End(), это решает проблему, но всегда вызывает исключение. Читайте в некоторых темах, что исключение сделано по проекту. Но тогда это точно, это не вызовет проблемы, такие как усечение ответа или так в любое время?

Как еще я могу написать просто данные файла.

Кстати, ранее мы писали счет-фактуру в формате PDF, и тогда не использовали Response.End(), что привело к неполной загрузке файла.

Может кто-нибудь дать основы записи пользовательских данных / файла в поток ответов.

2 ответа

Решение

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

Исключение ThreadAbortException, создаваемое Response.End() это дизайн и может быть безопасно проигнорировано.

Вместо Response.End() вы можете использовать

HttpContext.Current.ApplicationInstance.CompleteRequest()

Этот метод имеет тенденцию избегать бросать исключения:)

Другие вопросы по тегам