最初,我试图找出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();
我不会打电话给Response.Close()或Response.End()。
Response.Close()
Response.End()
Response.End()此时将停止页面执行/渲染。以下代码Response.End()将不会运行。响应在该点终止,而没有其他输出添加到流中。
Response.Close()与相似Response.End(),但允许在调用代码后执行代码(但不能在页面响应中发送进一步的输出)。
Response.Flush() 会将所有剩余的响应项目发送到页面。
Response.Flush()
来自IIS核心团队成员:
Response.Close将重置数据包发送到客户端,并且在错误条件以外的任何其他情况下使用它都会导致各种问题- 例如,如果您正在与客户端进行足够的延迟交谈,则重置数据包可能导致缓冲任何其他响应数据在服务器,客户端或介于两者之间的某个位置上。 在这种特殊情况下,压缩涉及在响应中寻找通用模式,并且压缩代码必须缓冲一定数量的响应,以增加找到更长的重复模式的机会- 一旦您将缓冲的这一部分无法发送给客户端,做Response.Close()。 简而言之,不要使用Response.Close()。
Response.Close将重置数据包发送到客户端,并且在错误条件以外的任何其他情况下使用它都会导致各种问题- 例如,如果您正在与客户端进行足够的延迟交谈,则重置数据包可能导致缓冲任何其他响应数据在服务器,客户端或介于两者之间的某个位置上。
在这种特殊情况下,压缩涉及在响应中寻找通用模式,并且压缩代码必须缓冲一定数量的响应,以增加找到更长的重复模式的机会- 一旦您将缓冲的这一部分无法发送给客户端,做Response.Close()。
简而言之,不要使用Response.Close()。