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

问题描述 投票:0回答:2

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

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()
...?

就像这篇文章一样。

那么用

Response.End
合适不合适?

c# asp.net
2个回答
5
投票

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

如果您使用 TransmitFile,或者您决定直接写入输出流,这并不重要,只是大多数时候您希望确保在发送文件后没有人可以写入单个字节。

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

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


5
投票

根据 Thomas Marquardt,您永远不应该使用

Response.End()
。相反,您应该使用
Context.ApplicationInstance.CompleteRequest()
。另请查看这篇文章,它来自 Microsoft KB,建议使用
Application.CompleteRequest()
代替
Response.End()

© www.soinside.com 2019 - 2024. All rights reserved.