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

时间:2013-01-28 16:41:37

标签: 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?

使用.Flush().End()是否真的很好?

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

但是在某些答案中,.End()被重新修改了......?

this文章一样。

那么使用Response.End是否恰当?

2 个答案:

答案 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()