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

本文关键字:Response TransmitFile End Net Asp | 更新日期: 2023-09-27 17:56:16

此代码的正确用法是什么?

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合适与否?

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

根据托马斯·马夸特的说法,你永远不应该使用Response.End()。相反,您应该使用 Context.ApplicationInstance.CompleteRequest() .也检查这篇文章,它来自 Microsoft KB,建议使用 Application.CompleteRequest() 而不是Response.End()

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

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

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

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