如何避免Response.End()在Excel文件下载过程中出现“线程被中止”exception

我试图将我的数据集转换成excel并下载该excel。我得到了我所需的excel文件。但System.Threading.ThreadAbortException被提出每个excel下载。 如何解决这个问题?请帮助我…

我在我的aspx屏幕中调用了这个方法。这个方法也抛出了同样的exception。

我在很多aspx屏幕中调用了public void ExportDataSet(DataSet ds)函数,而且我正在维护运行时引发的exception的错误logging器方法,这些exception都写入到.txt文件中。 所以aspx屏幕的所有txt文件中都logging了同样的exception。我只是想避免这种exception从方法声明的类文件抛出到aspx。 我只是想在我的方法声明类文件本身处理这个exception。

ASPX文件方法调用:excel.ExportDataSet(dsExcel);

方法定义:

public void ExportDataSet(DataSet ds) { try { string filename = "ExcelFile.xls"; HttpResponse response = HttpContext.Current.Response; response.Clear(); response.Charset = ""; response.ContentType = "application/vnd.ms-excel"; response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); using (StringWriter sw = new StringWriter()) { using (HtmlTextWriter htw = new HtmlTextWriter(sw)) { GridView dg = new GridView(); dg.DataSource = ds.Tables[0]; dg.DataBind(); dg.RenderControl(htw); // response.Write(style); response.Write(sw.ToString()); response.End(); // Exception was Raised at here } } } catch (Exception ex) { string Err = ex.Message.ToString(); EsHelper.EsADLogger("HOQCMgmt.aspx ibtnExcelAll_Click()", ex.Message.ToString()); } finally { } } 

我在网上研究,看到Response.End()总是抛出一个exception。

replace为: HttpContext.Current.Response.End();

有了这个:

  HttpContext.Current.Response.Flush(); // Sends all currently buffered output to the client. HttpContext.Current.Response.SuppressContent = true; // Gets or sets a value indicating whether to send HTTP content to the client. HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event. HttpContext.Current.Response.End(); 

这帮我处理了Thread was being abortedexception,

 try { //Write HTTP output HttpContext.Current.Response.Write(Data); } catch (Exception exc) {} finally { try { //stop processing the script and return the current result HttpContext.Current.Response.End(); } catch (Exception ex) {} finally { //Sends the response buffer HttpContext.Current.Response.Flush(); // Prevents any other content from being sent to the browser HttpContext.Current.Response.SuppressContent = true; //Directs the thread to finish, bypassing additional processing HttpContext.Current.ApplicationInstance.CompleteRequest(); //Suspends the current thread Thread.Sleep(1); } } 

如果使用下面的代码而不是HttpContext.Current.Response.End() ,那么Server cannot append header after HTTP headers have been sentexceptionServer cannot append header after HTTP headers have been sent ,您将获得Server cannot append header after HTTP headers have been sent

  HttpContext.Current.Response.Flush(); HttpContext.Current.Response.SuppressContent = True; HttpContext.Current.ApplicationInstance.CompleteRequest(); 

希望它有帮助

看起来是一样的问题:

当一个ASP.NET System.Web.HttpResponse.End()被调用时,当前线程被中止?

所以这是devise。 您需要为该exception添加捕获,并优雅地“忽略”它。

将Response.End()移到Try / Catch和Using块外部。

假设抛出一个exception来绕过请求的其余部分,你只是没有想到要抓住它。

 bool endRequest = false; try { .. do stuff endRequest = true; } catch {} if (endRequest) Resonse.End(); 

对于Response.End()方法的exception使用特殊的catch块

 { ... context.Response.End(); //always throws an exception } catch (ThreadAbortException e) { //this is special for the Response.end exception } catch (Exception e) { context.Response.ContentType = "text/plain"; context.Response.Write(e.Message); } 

或者只是删除Response.End(),如果你build立一个文件处理程序

只要把

 Response.End(); 

在一个finally块内而不是在try块内。

这已经为我工作了!

我有以下问题(与例外)的代码结构

 ... Response.Clear(); ... ... try{ if (something){ Reponse.Write(...); Response.End(); return; } some_more_code... Reponse.Write(...); Response.End(); } catch(Exception){ } finally{} 

并抛出exception。 我怀疑exception抛出的地方有代码/工作后执行response.End(); 。 在我的情况下,额外的代码只是返回本身。

当我刚移动response.End(); 到finally块(并留下返回的位置 – 这会导致跳过try块中的其余代码并跳转到finally块(不仅仅是退出包含函数))exception停止发生。

以下工作正常:

 ... Response.Clear(); ... ... try{ if (something){ Reponse.Write(...); return; } some_more_code... Reponse.Write(...); } catch(Exception){ } finally{ Response.End(); } 

对于Response.END();错误。 是因为你正在使用asp更新面板或使用JavaScript的任何控制,尝试使用控制原生从asp或html没有JavaScript或scriptmanager或脚本,然后再试一次

我从UpdatePanel删除链接button,并评论Response.End()成功!

我推荐这个解决scheme:

  1. 不要使用response.End();

  2. 声明这个全局variables:bool isFileDownLoad;

  3. 刚刚在你的(response.Write(sw.ToString());)set ==> isFileDownLoad = true;

  4. 覆盖你的渲染像:

    /// AEG:处理线程中止exception非常重要

    重写protected void Render(HtmlTextWriter w){if(!isFileDownLoad)base.Render(w); }

在response.end()之前刷新对客户端的响应

更多关于Response.Flush方法

所以在response.End();之前使用下面提到的代码response.End();

 response.Flush(); 

对我来说只有作品

HttpContext.Current.ApplicationInstance.CompleteRequest()。

https://stackoverflow.com/a/21043051/1828356

这不是问题,但这是devise。 Microsoft支持页面中描述了根本原因。

Response.End方法结束页面执行并将执行转移到应用程序事件pipe道中的Application_EndRequest事件。 在Response.End之后的代码行不被执行。

提供的解决scheme是:

对于Response.End,请调用HttpContext.Current.ApplicationInstance.CompleteRequest方法而不是Response.End来绕过代码执行到Application_EndRequest事件

这里是链接: https : //support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end–response-redi

我使用了上述所有更改,但仍然在我的Web应用程序中遇到同样的问题。

然后我联系了我的托pipe提供&请他们检查是否有任何软件或防病毒阻止我们的文件通过HTTP传输。 或ISP /networking不允许文件传输。

他们检查服务器设置并绕过我的服务器“数据中心共享防火墙”现在我们的应用程序能够下载文件。

希望这个答案会帮助别人。这是对我有用的