C# Response.End()与HttpContext.Current.ApplicationInstance.CompleteRequest()的比较

C# Response.End()与HttpContext.Current.ApplicationInstance.CompleteRequest()的比较,c#,C#,我们应用程序的用户每天至少每两秒钟下载一次附件 以前的场景: 我们使用Response.End()在用户下载附件后中止与客户端的连接。当我们遇到性能问题时,我们开始记录异常,重复次数最多的异常之一是线程中止异常。由于我们从web服务获取附件,因此必须进行一些清理,并在try-catch-finally块中进行清理。经过一些研究,我了解到Response.End()之后的任何代码即使在finally块中也不会被执行。是这样吗 当前情景: 我读过堆栈溢出中的线程关于Response.End()是有害

我们应用程序的用户每天至少每两秒钟下载一次附件

以前的场景:

我们使用Response.End()在用户下载附件后中止与客户端的连接。当我们遇到性能问题时,我们开始记录异常,重复次数最多的异常之一是线程中止异常。由于我们从web服务获取附件,因此必须进行一些清理,并在try-catch-finally块中进行清理。经过一些研究,我了解到Response.End()之后的任何代码即使在finally块中也不会被执行。是这样吗

当前情景:

我读过堆栈溢出中的线程关于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
在内部抛出
ThreadAbortException
以终止请求-如果需要执行某种清理,则需要在调用
Response.End
之前执行此操作


Response.Redirect
Response.End
与try/catch块的交互不好。因此,在您的情况下,您应该在try/catch中向响应流写入所有逻辑,然后在最后一个块之后调用
response.End

Old Q,不确定它是否有用,但我在创建PDF文件以交付给浏览器时基本上与您的示例相同。然而,在处理结束时,我有以下几点:

    Response.OutputStream.Flush()
    Response.OutputStream.Close()
    Response.End()
.Close()的添加基本上是。在生产中似乎工作得很好

艾德:我也找到了这个,提到Close():


解决问题的另一种方法是简单地重写Page_PreRender()并将内容交付代码放在其中(这在功能上是有意义的)。这样您肯定不会得到任何不需要的HTML,而且根本不需要Response.End()。

谢谢您的回复。我知道这会起作用,但我如何才能摆脱ThreadAbortException,它会填满我的日志文件,可能还会占用服务器上的一些内存。有没有一种方法可以在没有响应的情况下执行此操作。End()。编辑:另外,如果在我的finally块之后使用Response.End(),我会遇到同样的问题,即将呈现的html附加到下载的文档中。无论如何,我可以解决这个问题。再次感谢您的回复。停止包装
响应。在try/catch中结束
Response.End
使用
ThreadAbortException
结束响应。这就是它的工作原理。您基本上捕获到了框架的异常。我不会在尝试中包装Response.End()。。接住。谢谢你指出这一点。你能回复我的编辑吗?我刚刚尝试了你建议的代码,我又遇到了html问题。我真的很感谢你的回答。谢谢。我用代码编辑了这篇文章,这是try..catch块中的代码,我将response.end()放在finally之后。另外,如果有帮助,我将重定向到一个空的下载页面,上面发布的代码驻留在该下载页面的页面加载中,该页面将显示“打开/保存”对话框。谢谢。最后,在任何情况下都会执行块。他们从不被跳过。没有办法杀死线程。请不要在标题前加上“C#”之类的前缀。这就是标签的含义。当然。很抱歉。我刚开始在这里发帖。我将确保不再重复这一点。