2009-09-16 2 views
30

Я использую Server.Transfer. Все работает отлично, но журнал исключений показывает следующее исключение.Тема отменена

System.Threading.ThreadAbortException: Thread was being aborted. 
    at System.Threading.Thread.AbortInternal() 
    at System.Threading.Thread.Abort(Object stateInfo) 
    at System.Web.HttpResponse.End() 
    at System.Web.HttpServerUtility.Transfer(String path, Boolean preserveForm) 
    at System.Web.HttpServerUtility.Transfer(String path) 

Любая идея, чтобы избежать исключения.

ответ

38

Это исключение вызывается вызовом Server.Transfer, чтобы остановить выполнение текущего метода - точно так же получается, если вы сделаете Response.Redirect.

Два варианта вы находитесь:

  • Поймайте и повторно бросит ThreadAbortException/reperform Server.Transfer
  • Убедитесь, что вы только делать Server.Transfer в местах , где оно не будет пойманных (рекомендуется)

EDIT: Scratch что у http://support.microsoft.com/kb/312629 есть еще несколько предложений, но я по-прежнему рекомендую № 2 выше.

+0

http://programming360.blogspot.com/2009/10/thread-was-being-aborted.html –

8

Caling Server.Transfer вызовет Response.End, который всегда генерирует исключение ThreadAbortException. Это «специальное» исключение, потому что, хотя его можно поймать в блоке catch, он всегда будет перебрасываться в конец блока catch. Я бы запустил ваш журнал ошибок, игнорируя ThreadAbortExceptions.

+0

Это имеет смысл для меня, что Server.Transfer вызовет Response.End неявно. Что вы понимаете под ошибкой logging игнорировать threadAbortException. –

+4

Если вы регистрируете исключения в постоянной системе ведения журнала, я отфильтровываю ThreadAbortExceptions или получаю отчеты, которые запрашивают эту систему регистрации, отфильтровывая их. –

+0

Имеет смысл, что это исключение не является серьезным, поэтому я могу игнорировать его путем фильтрации .. спасибо. –

8

Эта проблема возникает в методах Response.Redirect и Server.Transfer, потому что оба метода вызывают Response.End внутренне.

Решение этой проблемы заключается в следующем.

Для Server.Transfer используйте вместо этого метод Server.Execute.

Посетите эту ссылку для примера примера. http://jayeshsorathia.blogspot.com/2012/03/thread-was-being-aborted-error-occured.html

8

Другой способ решить эту проблему, чтобы поймать сгенерированную ошибку и не повторно выдать его:

 catch (ThreadAbortException) 
     { 
     } 
+1

пустые уловы *** плохой *** – Rob

+3

@Rob, обычно, но не всегда. – Holf

0

Заменить Response.End() С HttpContext.Current.ApplicationInstance.CompleteRequest();