11

这段代码的正确用法是什么?

httpContext.Response.AddHeader("Content-Disposition", "inline; filename=" + HttpUtility.UrlPathEncode(fileName));
httpContext.Response.ContentType = "image/png";
httpContext.Response.AddHeader("Content-Length", new FileInfo(physicalFileName).Length.ToString());
httpContext.Response.TransmitFile(physicalFileName);
httpContext.Response.Flush();
httpContext.Response.End();  //Use it or not?

.Flush()用and真的很好用.End()吗?

根据这一点,您永远不应该使用Response.End()(仅在错误或黑客情况下)

但是在某些答案中,.End()建议使用...?

就像在这篇文章中一样。

那么到底该用Response.End还是不该用呢?

4

2 回答 2

5

根据Thomas Marquardt的说法,您永远不应该使用Response.End(). 相反,您应该使用Context.ApplicationInstance.CompleteRequest(). 也请查看这篇文章,它来自 Microsoft KB,推荐Application.CompleteRequest()使用Response.End().

于 2013-01-28T17:30:51.183 回答
5

我添加了这个,这样人们就不会陷入错误接受的响应:在传输文件后的大多数情况下,可能需要 Response.End()。

无论您是使用 TransmitFile,还是决定直接写入输出流,都没有关系,只是在大多数情况下,您希望确保在发送文件后没有人可以写入单个字节。

这一点特别重要,因为有时会在 IIS 上安装一个过滤器,在全局 asax EndRequest 上安装一个代码,或者一个调用您的代码然后做更多事情的开发人员,其中任何一个最终都会将更多内容附加到输出流中在您不注意的情况下,它会损坏您传输的文件内容。- CompleteRequest 不会让您摆脱这种情况,因为它允许在您调用它后在响应中添加更多内容。

Response.End() 是保证未来没有其他代码更改或 IIS 过滤器将按预期操纵您的响应的唯一方法。

于 2016-05-01T15:15:08.190 回答