如何避免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 aborted
exception,
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 sent
exceptionServer 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:
-
不要使用response.End();
-
声明这个全局variables:bool isFileDownLoad;
-
刚刚在你的(response.Write(sw.ToString());)set ==> isFileDownLoad = true;
-
覆盖你的渲染像:
/// 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()。
这不是问题,但这是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不允许文件传输。
他们检查服务器设置并绕过我的服务器“数据中心共享防火墙”现在我们的应用程序能够下载文件。
希望这个答案会帮助别人。这是对我有用的
- 如何在ASP.Net中的一个ASP:Button中放置一个Bootstrap Glyphicon?
- 在ASP.NET中强制caching过期的最佳方法是什么?
- 什么内容types强制下载文字回复?
- ASP.NET 4.5 MVC 4不适用于Windows Server 2008 IIS 7
- 在ASP.NET中的DataGrid和GridView之间的区别?
- 从DataReader对象中查找Field的数据types
- 当ios 7虚拟键盘存在时,Div元素不会停留在底部
- Sys.WebForms.PageRequestManagerParserErrorException:从服务器收到的消息无法parsing
- 新的asp.net图表控件 – 他们将使用MVC(最终)?