一尘不染

ASP.NET如何将文件流传输到用户

c#

最初,我试图找出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();

阅读 330

收藏
2020-05-19

共1个答案

一尘不染

我不会打电话给Response.Close()Response.End()

Response.End()此时将停止页面执行/渲染。以下代码Response.End()将不会运行。响应在该点终止,而没有其他输出添加到流中。

Response.Close()与相似Response.End(),但允许在调用代码后执行代码(但不能在页面响应中发送进一步的输出)。

Response.Flush() 会将所有剩余的响应项目发送到页面。

来自IIS核心团队成员

Response.Close将重置数据包发送到客户端,并且在错误条件以外的任何其他情况下使用它都会导致各种问题-
例如,如果您正在与客户端进行足够的延迟交谈,则重置数据包可能导致缓冲任何其他响应数据在服务器,客户端或介于两者之间的某个位置上。

在这种特殊情况下,压缩涉及在响应中寻找通用模式,并且压缩代码必须缓冲一定数量的响应,以增加找到更长的重复模式的机会-
一旦您将缓冲的这一部分无法发送给客户端,做Response.Close()。

简而言之,不要使用Response.Close()。

2020-05-19