Ошибка при попытке экспортировать данные в Excel.

#c# #asp.net #excel #telerik #export

#c# #asp.net #excel #telerik #экспорт

Вопрос:

У меня есть кнопка, которая экспортирует данные из RadGrid от telerik в документ Excel.

Однако при попытке экспорта я сталкиваюсь со следующей ошибкой:

 [System.Threading.ThreadAbortException]: 
{Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.}
  

Вот мой код:

 private void GenerateFile(object structure, string fileName)
{
    Workbook workbook = structure as Workbook;

    var formatProvider = new XlsxFormatProvider();

    try
    {
        using (MemoryTributary ms = new MemoryTributary())
        {
            Response.ClearHeaders();
            Response.ClearContent();
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment; filename="   fileName);

            formatProvider.Export(workbook, ms);
            ms.Position = 0;
            ms.WriteTo(Response.OutputStream);

            Response.End();
            }
        }
        catch (System.OutOfMemoryException ex)
        {
        }
    }
}
  

Я попробовал следующие решения, основанные на сообщениях, которые я нашел в Интернете, которые касались той же проблемы, ни одно из решений не сработало:

  • Измените «Response.End()» на «HttpContext.Current.ApplicationInstance.CompleteRequest()»
  • Измените «Response.End()» на «HttpContext.Current.Response.End()»
  • Переместите «Response.End()» внутрь блока finally.
  • Переместите «Response.End()» за пределы области try-catch.

Ни одно из вышеперечисленных решений не решило проблему. Любые дальнейшие советы о том, как устранить эту ошибку, будут очень признательны.

Спасибо.

Комментарии:

1. Сначала удалите этот catch блок. Если вы получаете исключение, вы должны исследовать и исправить его, а не пытаться скрыть его. Во-вторых, Response.End означает немедленное завершение обработки, как при немедленном прерывании потока. Вы буквально попросили прервать поток

2. Почему вы используете Response.End() ? Это не требуется

Ответ №1:

Вы вызываете исключение, вызывая Response.End End . Документированное поведение заключается в очистке буферов и немедленном прерывании текущего запроса путем его прерывания. Он не используется в .NET-программировании. Это только для совместимости со старым кодом ASP.

Просто удалите Response.End() из своего кода

Вы также должны удалить catch инструкцию. Исключения должны быть исследованы и исправлены, а не скрыты. Исключение OutOfMemoryException означает, что с кодом что-то серьезно не так, что вызывает утечки. Это может быть вызвано либо тем, что у вас заканчивается память, либо тем, что память настолько фрагментирована, что .СЕТЬ не может выделить достаточно большой блок

Комментарии:

1. Спасибо за совет по поводу оператора catch, всегда ценю отзывы о моем коде. После того, как я последовал вашему предложению и удалил Ответ. В конце моего кода файл не загружается, просто открывается Excel, и я получаю сообщение об ошибке, в котором говорится, что возникла проблема с некоторым содержимым в моем файле. И он может попытаться восстановиться настолько, насколько это возможно.