32

I am using Server.Transfer. Everything works fine, but exception log shows following exception.

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)

Any idea to avoid above exception.

Guido
  • 44,623
  • 26
  • 117
  • 170
Syed Tayyab Ali
  • 3,585
  • 7
  • 29
  • 35

6 Answers6

41

This exception is throw by the call to Server.Transfer in order to halt the execution of the current method - exactly the same thing gets thrown if you do Response.Redirect.

The two choices you have are:

  • Catch and rethrow the ThreadAbortException / reperform the Server.Transfer
  • Make sure that you only do Server.Transfer in places where it wont be caught (recommended)

EDIT: Scratch that, http://support.microsoft.com/kb/312629 has a couple of other suggestions to try, but I still recommend #2 above.

Justin
  • 82,493
  • 48
  • 216
  • 356
11

Another way to solve this, is to catch the generated error and to not rethrow it:

        catch (ThreadAbortException)
        { 
        }
8

This problem occurs in the Response.Redirect and Server.Transfer methods because both methods call Response.End internally.

Solution for this Problem is as follows.

For Server.Transfer, use the Server.Execute method instead.

Visit this link for download sample example. http://jayeshsorathia.blogspot.com/2012/03/thread-was-being-aborted-error-occured.html

Jayesh Sorathia
  • 1,558
  • 15
  • 15
8

Caling Server.Transfer will call Response.End which always throws a ThreadAbortException. This is a "special" exception because while it can be caught in a catch block, it will always be re thrown at the end of the catch block. I would have your error logging ignore ThreadAbortExceptions.

Ian Kemp
  • 26,561
  • 17
  • 107
  • 129
Matt Wrock
  • 6,502
  • 28
  • 23
  • It make sense to me that Server.Transfer will call Response.End implicitly. What do you mean by error logging ignore threadAbortException. – Syed Tayyab Ali Sep 16 '09 at 14:54
  • 4
    If you are logging exceptions to a persistable logging system, I would filter out ThreadAbortExceptions or have your reports that query this loging system filter them out. – Matt Wrock Sep 16 '09 at 15:02
  • It make sense that this exception is not serious one, therefore I can ignore it by filtering out.. thank you. – Syed Tayyab Ali Sep 16 '09 at 15:11
1

Replace Response.End() With HttpContext.Current.ApplicationInstance.CompleteRequest();

Tunaki
  • 125,519
  • 44
  • 317
  • 399
Zuhair Ali
  • 21
  • 6
0

Replacing Response.End() by the following helped fix the problem.

Response.Flush(); Response.Close();

Refer Can we use Response.Flush () instead of Response.End()

Community
  • 1
  • 1