#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, и я получаю сообщение об ошибке, в котором говорится, что возникла проблема с некоторым содержимым в моем файле. И он может попытаться восстановиться настолько, насколько это возможно.