6

最初我试图弄清楚 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();
4

1 回答 1

17

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

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

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

Response.Flush()会将任何剩余的响应项发送到页面。

来自IIS 核心团队成员

Response.Close 向客户端发送一个重置数据包,并且在除错误条件之外的任何情况下使用它都会导致各种问题 - 例如,如果您正在与具有足够延迟的客户端交谈,则重置数据包可能会导致任何其他响应数据缓冲在服务器、客户端或两者之间的某个地方被删除。

在这种特殊情况下,压缩涉及在响应中查找常见模式,并且必须通过压缩代码缓冲一定数量的响应以增加找到更长重复模式的机会 - 一旦你缓冲了这部分就不能发送给客户端做响应。关闭()。

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

于 2009-04-10T01:26:42.390 回答