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(),它可以解决问题,但它总是抛出异常。在某些线程中读到异常是设计使然。但是可以肯定的是,它不会随时引起响应截断之类的问题吗?

我怎么能只写文件数据。

顺便说一句,早些时候我们将发票写成 PDF,那次没有使用 Response.End() 导致文件下载不完整。

有人可以提供将自定义数据/文件写入响应流的基础知识。

4

2 回答 2

2

那是因为响应是缓冲的。您必须调用Response.End()来刷新缓冲区并确保客户端在处理程序线程完成之前获得完整的响应。

抛出的ThreadAbortExceptionResponse.End()是设计使然,可以放心地忽略。

于 2011-02-01T12:50:37.360 回答
1

而不是 Response.End() 您可以使用

HttpContext.Current.ApplicationInstance.CompleteRequest()

这种方法倾向于避免抛出异常:)

于 2011-02-01T12:51:18.757 回答