2011-02-01 4 views
2
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() обязательным в данном сценарии?

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

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

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

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

ответ

2

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

ThreadAbortException, заброшенный Response.End() по дизайну и может быть смело проигнорирован.

+0

Ну у меня есть внешний блок попробовать и сейчас, так как это исключение игнорируемые я завернул его в dummy try { Response.End(); } catch (Exception ex) { Logger.LogException (ex); } –

+0

Но его выход в внешний блок catch также имеет код для отображения сообщения об ошибке пользователю. –

+0

@Munish, боюсь, я не понимаю: поскольку вы проглатываете исключение, оно не должно распространяться на внешний охват. (Кроме того, вы должны поймать 'ThreadAbortException' вместо общего типа« Исключение »). –

1

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

HttpContext.Current.ApplicationInstance.CompleteRequest() 

Этот метод как правило, чтобы избежать бросание исключения :)

+0

Я получаю сообщение об ошибке компилятора: CS0103: имя «HttpContext» не существует в текущем контексте –

+0

попробуйте полный путь: System.Web.HttpContext .... – Ozzy

+1

Странно, что я использовал «System.Web»; Может быть неоднозначной проблемой разрешения имен. Во всяком случае, но компиляция работала с использованием полного пути. но функциональность все тот же. все еще идет как файл + перемещение данных страницы. –

Смежные вопросы