При обновлении до 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();
}

person Jimmy Genslinger    schedule 08.06.2017    source источник
comment
Не удалось воспроизвести вашу ошибку. Ваш код работал на меня. Обратите внимание, что Response.End бросать ThreadAbortException нормально   -  person krlzlx    schedule 12.06.2017
comment
ну, спасибо за попытку ... этот же код отлично работал в VS 2012, поэтому я не знаю, возможно, я сделал что-то, чтобы скрыть сообщение много лет назад и не помню или что. Знаете ли вы, есть ли лучший способ экспортировать файлы, не вызывающий ошибок?   -  person Jimmy Genslinger    schedule 12.06.2017
comment
Я использовал тот же код, что и вы, для отправки файлов клиенту, за исключением того, что у меня есть Response.Close() перед Response.End(), но я не думаю, что это имеет значение. Вы проверяли этот вопрос?   -  person krlzlx    schedule 12.06.2017


Ответы (1)


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

person Jimmy Genslinger    schedule 12.06.2017
comment
Обратите внимание, что я использую NPOI для создания файла Excel, а переменная wb - это моя рабочая книга, созданная NPOI ... - person Jimmy Genslinger; 12.06.2017