2015-11-11 4 views
0

У меня есть попытка catch в методе button_Click(), где я использую EPPlus для сохранения некоторых данных в электронной таблице Excel.Response.End вызывает System.Threading.ThreadAbortException

try 
{ 
.... Some calculations here... 
    //Create Excel output. 
       Response.Clear(); 
       Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
       Response.AddHeader("content-disposition", "attachment; filename=Report " + 
            DateTime.Today.Day.ToString() + "-" + DateTime.Today.Month.ToString() + "-" + 
            DateTime.Today.Year.ToString() + " " + DateTime.Now.Hour + "-" + 
            DateTime.Now.Minute + "-" + DateTime.Now.Second + ".xlsx"); 
       package.SaveAs(Response.OutputStream); 
       Response.End(); 
} 

cach() 
{ 
    LogException(); 
} 

Я получаю System.Threading.ThreadAbortException ошибки, которые я получаю из Response.End() выше, я получаю это.

Что действительно раздражает, так это то, что, несмотря на то, что на моей машине dev он все еще выводит файл, но когда я помещаю сайт на сервер, он регистрирует ошибку, страница постоянно загружается и никогда не выплевывает файл.

У кого-нибудь есть идея, что там происходит?

+0

1) Вы используете 'async' и' await'? 2) Вы уже отправили ответ в вычислениях? –

+0

'Response.End()' всегда выдает 'ThreadAbortException', потому что текущий поток, ответственный за обработку сообщения HTTP-ответа, сразу же прерывается после вызова метода' End'. –

+0

Нет ожидания или асинхронного использования. –

ответ

3

Просто поймайте ThreadAbortException и ничего не сделайте. Вы можете смело игнорировать это исключение.

EDIT: Избавиться от журнала, или добавить проверку не войти в ThreadAbortException

catch(Exception ex){ 
    if (ex is System.Threading.ThreadAbortException) 
    { 
     //do nothing 
     return; 
    }else{ 
     LogException(ex); 
    } 
} 
+1

Это то, что я сделал и на моем тоже, не было никакого способа сделать что-то действительно неправильное в Response.End. Иногда это происходит, и Microsoft пытается понять, почему, из того, что я читал. – NETRookie

+0

Так что ошибка не проблема, я могу справиться с этим. Проблема в том, что мой файл не представлен пользователю. –

+0

@sd_dracula см. Мое редактирование – meda

1

Когда Response.Redirect или Response.End находится в Ьгу блоке, код в блоке Загвоздка казнены.

Вы можете поймать и поглотить это исключение TreadAbortException.

Вы также можете рассмотреть возможность добавления блока finally, который завершает ответ, вместо того, чтобы иметь его в попытке. Если вы поймаете исключение, вы можете изменить ответ и отправить сообщение клиенту.