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();
}

このコードは、Web ページの [Excel にエクスポート] ボタンで使用されています。これは、正しく動作する同じ機能を使用する別のページから直接コピーされます。

この問題をデバッグする方法についてのアイデアはありますか? 例外を確認できるようになるにはどうすればよいですか? また、関連する質問はここでどのように適用されますか? 上位の回答と選択された回答は非常にあいまいです。

tableのデータはセッション状態で保存されることに注意してください。

前もって感謝します。

4

3 に答える 3

4

It can be solved without getting an exception.

Instead of the

Response.End()

use the

Response.Flush()

function which does not stop the execution of the page.

I've also had some problems when I've tried to download an .xlsx file using the Reponse of the page: after opening the excel file I've got the following error text:

Excel found unreadble content in myFilename.xlsx. Do you want to recover the contents of this workbook? If you trust the source of this book, click Yes.

Solved this with adding Response.SuppressContent = true; after the 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

Response.End() の代わりに HttpContext.Current.ApplicationInstance.CompleteRequest() を使用する

于 2017-05-05T06:55:22.257 に答える