Вопрос по c#, asp.net – Невозможно оценить выражение ... на веб-странице

0

Связанный с этим вопросом:Невозможно оценить выражение, потому что код оптимизирован или собственный фрейм находится над стеком вызовов.

В настоящее время я вижу это в моем исключении:

{Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.}

Вот неправильный код. Исключение выдается при ответе. 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 хранится в состоянии сеанса.

Заранее спасибо.

Попробуй переехатьResponse.End() внеusing блок. mellamokb
@ mellamokb Нет, кости. : ( Nick Vaccaro
Зачем ты звонишьResponse.End() на первом месте? mellamokb

Ваш Ответ

3   ответа
0

вместо Response.End ()

2

вы получаете исключение 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
        }
Вместо Response.End () необходимо использовать HttpContext.Current.ApplicationInstance.CompleteRequest (), а вместо Response.Redirect использовать Response.Redirect (& quot; Error.aspx & quot ;, false); и вместо Server.Transfer, используйте метод Server.Execute
3

Вместо

Response.End()

использовать

Response.Flush()

функция, которая не останавливает выполнение страницы.

У меня также были некоторые проблемы, когда я пытался загрузить.xlsx файл с использованиемReponse страницы: после открытия файла Excel я получил следующий текст ошибки:

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.

Решил это с добавлениемResponse.SuppressContent = true; послеResponse.Flush().

Похожие вопросы