我们可以使用Response.Flush()而不是Response.End()

Response.End()生成ThreadAbortException

使用HttpContext.Current.ApplicationInstance.CompleteRequest代替它并不能解决问题。

那么,我们可以使用Response.Flush()而不是Response.End()

Response.Flush()被发送到浏览器上的缓冲区,但不会停止页面的处理,因此它将继续执行下一步。

什么是Response.End()做的是停止asp.net页面生命周期中下一个函数调用的执行步骤http://msdn.microsoft.com/en-us/library/ms178472.aspx

这就是为什么它需要抛出exception,抛出一系列调用的循环。

一个替代方案是Response.Close()但这也不会停止执行步骤,如果您尝试在与浏览器关闭后发送内容,则可能还有其他错误。 如果你做Response.Close()你需要在调用它之前做Flush() ,否则浏览器会得到不可预测的数据。

您还可以阅读: 重定向到endResponse为真的VS CompleteRequest和安全线程的页面

在下载文件Response.IsClientConnected之前使用条件 –

 if (Response.IsClientConnected) { Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.ContentType = "Application/pdf"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); Response.TransmitFile(Server.MapPath(@"yourpath" + fileName)); Response.Flush(); Response.Close(); } 

经过多次努力,这对我很有用。 我希望它对你也有用。