正确使用Asp.Net Response.TransmitFile和Response.End()

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

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().End()真的很好吗?

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

但在一些答案中.End()被重新修改……?

喜欢这篇文章。

所以使用Response.End是否合适?

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

如果您使用TransmitFile,或者您决定直接写入输出流,则无关紧要,只需要确保在发送文件后没有人可以写入单个字节。

这一点特别重要,因为在某些时候会在IIS上安装filter,全局asax EndRequest上的代码,或者调用代码然后执行更多操作的开发人员,其中任何一个最终都会在输出流中添加更多内容没有你注意到它,它将破坏你传输的文件内容。 – CompleteRequest不会为您节省费用,因为它允许在您调用后在响应中添加更多内容。

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

根据Thomas Marquardt的说法,你永远不应该使用Response.End() 。 相反,您应该使用Context.ApplicationInstance.CompleteRequest() 。 查看本文 ,它来自Microsoft KB,建议使用Application.CompleteRequest()而不是Response.End()