我目前在我的例外中看到了这一点:
{无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上。}
这是有问题的代码。在response.End();
上抛出异常DataSet dataSet = new DataSet();
dataSet.Tables.Add(table);
// Table is a well-formatted DataTable formed from data stored in a Session variable
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.Charset = "";
response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment;filename=\"ExcelFile.xls\"");
using (StringWriter stringWriter = new StringWriter())
using (HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter))
{
DataGrid dataGrid = new DataGrid { DataSource = dataSet.Tables[0] };
dataGrid.DataBind();
dataGrid.RenderControl(htmlTextWriter);
response.Write(stringWriter.ToString());
response.End();
}
此代码用于网页上的“导出到Excel”按钮。这是直接从使用相同功能的另一个页面复制的。
有关如何调试此问题的任何想法?我怎样才能达到可以看到异常的程度?此外,相关问题如何适用于此?最佳答案和选定的答案非常模糊。
请注意table
中的数据存储在会话状态。
提前致谢。
答案 0 :(得分:3)
可以在不得异常的情况下解决。
而不是
Response.End()
使用
Response.Flush()
不会停止执行页面的功能。
当我尝试使用页面的Reponse
下载 .xlsx 文件时,我也遇到了一些问题:打开excel文件后我得到了以下内容错误文字:
Excel在myFilename.xlsx中找到了不可读的内容。你想恢复这个工作簿的内容吗?如果您信任本书的来源,请单击“是”。
通过在Response.SuppressContent = true;
之后添加Response.Flush()
来解决此问题。
答案 1 :(得分:2)
代码很好。当您执行Response.End()时,您会收到ThreadAbortException:
http://support.microsoft.com/kb/312629/EN-US/
有些人认为Response.End()过于激烈了:
Is Response.End() considered harmful?
我建议处理这个特定的异常(因为你知道你会得到它),然后移动reponse.End()(就像mellamokb建议的那样):
HttpResponse response = HttpContext.Current.Response;
try
{
DataSet dataSet = new DataSet();
DataTable table = new DataTable();
dataSet.Tables.Add(table);
response.Clear();
response.Charset = "";
response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment;filename=\"ExcelFile.xls\"");
using (StringWriter stringWriter = new StringWriter())
using (HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter))
{
DataGrid dataGrid = new DataGrid { DataSource = dataSet.Tables[0] };
dataGrid.DataBind();
dataGrid.RenderControl(htmlTextWriter);
response.Write(stringWriter.ToString());
}
response.End();
}
catch (ThreadAbortException ex)
{
//Log some trace info here
}
答案 2 :(得分:0)
使用HttpContext.Current.ApplicationInstance.CompleteRequest()代替Response.End()