33

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
  • 46,642
  • 28
  • 120
  • 174
Syed Tayyab Ali
  • 3,643
  • 7
  • 31
  • 36

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
  • 84,773
  • 49
  • 224
  • 367
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.

Blarghedy
  • 47
  • 8
Jayesh Sorathia
  • 1,596
  • 15
  • 16
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
  • 28,293
  • 19
  • 112
  • 138
Matt Wrock
  • 6,590
  • 29
  • 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

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
1

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

Tunaki
  • 132,869
  • 46
  • 340
  • 423
Zuhair Ali
  • 19
  • 6