0

与此问题相关: 无法评估表达式,因为代码已优化或本机框架位于调用堆栈顶部

我目前在我的例外中看到了这一点:

{无法评估表达式,因为代码已优化或本机框架位于调用堆栈顶部。}

这是有问题的代码。在 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以 Session 状态存储。

提前致谢。

4

3 回答 3

4

它可以在没有异常的情况下解决。

而不是

Response.End()

使用

Response.Flush()

不停止页面执行的函数。

当我尝试使用页面下载.xlsx文件时,我也遇到了一些问题Reponse:打开 excel 文件后,我收到以下错误文本:

Excel 在 myFilename.xlsx 中发现了不可读的内容。是否要恢复此工作簿的内容?如果您信任本书的来源,请单击是。

通过Response.SuppressContent = true;Response.Flush().

于 2015-04-09T08:54:05.100 回答
2

代码很好。当您执行 Response.End() 时,您会得到一个 ThreadAbortException:

http://support.microsoft.com/kb/312629/EN-US/

有些人认为 Response.End() 过于激烈:

Response.End() 被认为是有害的吗?

我建议处理这个特定的异常(因为你知道你会得到它),并移动 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
        }
于 2012-05-25T16:09:39.543 回答
0

使用 HttpContext.Current.ApplicationInstance.CompleteRequest() 而不是 Response.End()

于 2017-05-05T06:55:22.257 回答