无法在网页上评估表达式....

时间:2012-05-25 14:37:15

标签: c# asp.net .net-3.5 exception-handling error-handling

与此问题相关:Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack

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

  

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

这是有问题的代码。在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中的数据存储在会话状态。

提前致谢。

3 个答案:

答案 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()