Response.End()vs HttpContext.Current.ApplicationInstance.CompleteRequest()

我们的应用程序的用户在白天至少两秒内下载一个附件。

以前的场景:

我们使用Response.End()在用户下载附件后中止与客户端的连接。 由于我们遇到性能问题,我们开始记录exception,其中最重复的一个是线程中止exception。 由于我们从Web服务获取附件,我们必须进行一些清理,并且我们在try-catch-finally块中进行了清理。 经过一些研究,我已经理解,即使它在finally块中,也不会执行Response.End()之后的任何代码。 是对的吗?

目前的情景:

我已经阅读了关于Response.End()的堆栈溢出中的线程是有害的,它只在真正需要时才需要使用,所以我决定使用HttpContext ….而不是CompleteRequest()。 使用此代码,完成所需的清理工作,但渲染的html将附加到下载的附件中。 我尝试覆盖同一文章中提出的Render和RaisePostBackEvent,但问题仍然存在。 有关如何解决此问题的任何想法都会有所帮助。

码:

HttpContext.Current.Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Content-Disposition", "attachment; filename=" + filename); Response.AddHeader("Content-Length", fileContent.Length.ToString()); Response.ContentType = "application/octet-stream"; Response.BinaryWrite(fileContent); Response.Flush(); 

Response.End内部抛出ThreadAbortExceptionThreadAbortException请求 – 如果你需要进行某种清理,这需要在调用Response.End 之前完成。

Response.RedirectResponse.End与try / catch块没有很好的交互。 因此,在您的情况下,您应该将所有逻辑写入try / catch中的响应流,然后在finally块之后调用Response.End

旧Q,并不确定它是否有帮助,但在创建PDF文件以传送到浏览器时,我的确与您的示例基本相同。 但是,在处理结束时,我有以下内容:

  Response.OutputStream.Flush() Response.OutputStream.Close() Response.End() 

基本上添加了.Close()。 似乎在生产中工作正常。

Ed:刚发现这个,提到Close(): Response.End()被认为有害吗?

解决问题的另一种方法是简单地覆盖Page_PreRender()并将内容交付代码放在那里(哪种方式具有function意义)。 那么你肯定不会得到任何不需要的HTML,并且根本不需要Response.End()。