此代码的正确用法是什么?
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()
是否真的很好?
根据this,您永远不应该使用Response.End()
(仅在错误或黑客情况下)
但是在某些答案中,.End()
被重新修改了......?
与this文章一样。
那么使用Response.End
是否恰当?
答案 0 :(得分:5)
我正在添加此内容,以便人们不会陷入错误接受的响应中:在传输文件后,大多数情况下都可能需要Response.End()。
如果使用TransmitFile,或者如果您决定直接写入输出流,则无关紧要,只需要确保在发送文件后没有人可以写入单个字节。
这一点特别重要,因为在某些时候会在IIS上安装一个过滤器,一个全局asax EndRequest上的代码,或一个调用你的代码然后做更多事情的开发人员,其中任何一个最终都会附加更多内容输出流没有你注意到它,它将破坏你传输的文件内容。 - CompleteRequest不会让您免于此,因为它允许在您调用后在响应中添加更多内容。
Response.End()是保证没有其他未来代码更改的唯一方法,或IIS过滤器将按预期操作您的响应。
答案 1 :(得分:3)
根据Thomas Marquardt,您绝不能使用Response.End()
。相反,您应该使用Context.ApplicationInstance.CompleteRequest()
。请检查此article,它来自Microsoft KB,建议使用Application.CompleteRequest()
代替Response.End()
。