ApplicationInstance.CompleteRequest()与Response.End()的奇怪行为

时间:2016-07-01 16:13:24

标签: asp.net httpresponse

我观察到使用以下代码下载文件时:

HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=~/test.pdf");
HttpContext.Current.Response.WriteFile("~/test.pdf");
HttpContext.Current.ApplicationInstance.CompleteRequest();

我们得到的文件大于使用以下代码的文件:

HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=~/test.pdf");
HttpContext.Current.Response.WriteFile("~/test.pdf");
HttpContext.Current.Response.End();

较大的尺寸是因为在第一种情况下,在文件结束之后添加了从中下载文件的页面的源代码。因此,所有下载的文件都增加了固定的字节数,等于源代码的字节长度。对于PDF,当使用Adobe Reader打开它时,这些额外的字节被解释为更改,当关闭提示保存更改时,之后pdf恢复其较小的大小。如果文件与十六进制编辑器进行比较,则警告相同但大小不同,最后可以在EOF标记后看到页面源代码的字节。

如果不使用物理文件,而是使用MemoryStream并通过Response.BinaryWrite()发送字节数组,那么情况也是如此。

这种行为可能是什么原因以及如何纠正?

2 个答案:

答案 0 :(得分:0)

我找到了解决方案。使用Response.SupressContent(),抑制EOF标记后添加的html,文件pdf与源相同:

HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=~/test.pdf");
HttpContext.Current.Response.WriteFile("~/test.pdf");
Response.Flush();
Response.SuppressContent = true;
HttpContext.Current.ApplicationInstance.CompleteRequest();

答案 1 :(得分:0)

为避免在使用HttpApplication.CompleteRequest()时呈现页面,可以将Page.Visible设置为false。这比HttpResopnse.SuppressContent更好,因为它实际上避免了首先呈现内容而不是执行内容。

我认为也建议避免使用Flush(),因为这样可以防止异步刷新。

在编写此代码时,假定它位于System.Web.UI.Page的子类中:

Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=~/test.pdf");
Response.WriteFile("~/test.pdf");
Response.SuppressContent = true;
Visible = false;
Context.ApplicationInstance.CompleteRequest();