Обновление до VS 2015, теперь возникают проблемы с экспортом Excel из-за Response.End

Я нахожусь в процессе обновления проекта с VS 2012 до 2015, я до последней ошибки, которая заставляет файлы Excel экспортировать. Я использую NPOI для создания файла Excel и приведенный ниже код для его экспорта. Как только код попадает в строку Response.End(), я получаю следующее сообщение об ошибке:

Возникло исключение: "System.Threading.ThreadAbortException" в mscorlib.dll Дополнительная информация: поток был прерван.

Файл все еще загружается однако и открывается отлично. Я попытался закомментировать строку Response.End() и не получил ошибки из кода, однако при открытии файла Excel я получаю эту ошибку:

Мы обнаружили проблему с некоторым содержимым в ContactNPOI.xlsx. Вы хотите, чтобы мы попытались восстановить столько, сколько мы можем? Если вы доверяете источнику этой книги, нажмите Да.

Итак, я предполагаю, что без Response.End() поток не закрывается должным образом или что-то? Я начал исследовать и обнаружил, что это известная проблема, и попытаться использовать HttpContext.Current.ApplicationInstance.CompleteRequest() вместо Response.End(). Я попробовал это и не получил ошибки из кода, но, к сожалению, все еще получил вышеупомянутую ошибку при попытке открыть файл Excel.

Ниже приведен мой фрагмент кода, кто-нибудь может предложить исправить это, или, возможно, более чистый способ экспорта файлов Excel?

XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sh = (XSSFSheet)wb.CreateSheet("Instructional Hrs");

//Create Header Row
var headerRow1 = sh.CreateRow(0);
headerRow1.CreateCell(0).SetCellValue("Jimmy G Rocks!!");

using (var stream = new MemoryStream())
{
    Response.Clear();
    wb.Write(stream);
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "ContactNPOI.xlsx"));
    Response.BinaryWrite(stream.ToArray());
    Response.Flush();
    Response.End();
    //HttpContext.Current.ApplicationInstance.CompleteRequest();
}

1 ответ

Спасибо @krlzlx за помощь... вот решение, которое в конечном итоге сработало для меня, которое не выдает ошибку ни в Visual Studio, ни при открытии файла Excel:

using (var stream = new MemoryStream())
{
    Response.Clear();
    wb.Write(stream);
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "CCR Student Instructional Hours.xlsx"));
    Response.BinaryWrite(stream.ToArray());
    Response.Flush();
    HttpContext.Current.ApplicationInstance.CompleteRequest();
    Response.Close();
}

Я видел много сайтов, в которых говорилось о необходимости заменить Response.End() на HttpContext.Current.ApplicationInstance.CompletelRequest(), но просто поменять эту строку вызывало ошибку при открытии листа Excel. После продолжения игры, я обнаружил, что добавление Response.Close() после строки CompleteRequest устранило ошибку Excel, и теперь я загружаю без ошибок!!

Другие вопросы по тегам