使用 Response.end() 会产生ThreadAbortException 的异常。 试着要解决该问题。
我产生该问题的场景是: GridView 导出为Excel 涉及代码为:
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter htw = new HtmlTextWriter(sw);
Page page = new Page();
HtmlForm form = new HtmlForm();
ctl.EnableViewState = false;
page.EnableEventValidation = false;
page.DesignerInitialize();
page.Controls.Add(form);
form.Controls.Add(ctl);
page.RenderControl(htw);
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8) + ".xls");
Response.Charset = "UTF-8";
Response.ContentEncoding = Encoding.Default;
Response.Write("<html>");
Response.Write("<head><meta http-equiv=/"Content-Type/" contect=/"text/html/";charset=gb2312/"></head>");
Response.Write(sb.ToString());
Response.Write("</html>");
Response.End();
注意使用该方法 GridView 不能隐藏, 否则form.Controls.Add(ctl);为空字符
不管如何,都会产生该异常。
在网上找了好几个小时,都没有解决该问题, 只能用try{}catch{}将导出代码包起来。算是把问题处理了, 但这样处理毕竟不尽人意。
网上有说: 用HttpContext.Current.ApplicationInstance.CompleteRequest();取代Response.End(); 但是没有用。(该方法不会终止一个请求)
具体解释为:
“利用HttpModule通过调用HttpApplication.CompleteRequest()方法实现当满足某一个条件时终止此次的HTTP请求。需要注意的是,即使调用了HttpApplication.CompleteRequest()方法终止了一个HTTP请求,ASP.NETFramework仍然会触发HttpApplication后面的这3个事件:EndRequest事件、PreSendRequestHeaders事件、PreSendRequestContent事件。”
而且在end()更改的页面提示信息无法发送到客户端。
困惑呀! 只能把该问题记下来,找机会在解决!