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

Mar*_*kus 11 c# asp.net

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

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?
Run Code Online (Sandbox Code Playgroud)

难道真的很好用.Flush().End()

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

但在一些答案中,.End()修正了......?

喜欢这篇文章.

那么使用Response.End与否是合适的?

Mar*_*ius 5

根据Thomas Marquardt 的说法,您永远不应该使用Response.End(). 相反,您应该使用Context.ApplicationInstance.CompleteRequest(). 勾选此文章为好,这是从微软KB,推荐使用的Application.CompleteRequest()替代Response.End()


Dan*_*dra 5

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

如果您使用TransmitFile,或者您决定直接写入输出流,则无关紧要,大多数情况下您希望确保在发送文件后没有人可以写入单个字节.

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

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

  • 这是绝对正确的,而且效率也非常低,但我还没有找到任何其他方法来强制没有其他代码片段会改变响应输出流.只是举个例子,你的IT安全部门可能会安装一年中的任何一天在没有问你的情况下,IIS上的一个http模块将过滤请求,并且可能会在响应通过网络之前在输出流上附加"版权"消息(或者为了跟踪目的注入一些企业cookie等).想象一下,在您的下载中遇到各种问题而不知道是什么打击了您. (2认同)