Monday, February 25, 2008

ThreadAbortException while using Response.End

Whenever there is a call to Response.End() method in your ASP.NET code, and there are lines of code following this call (which we expect not to be executed), then in such a case a System.Threading.ThreadAbortException is thrown which can be caught using a try-catch block.

This exception can also be thrown while calling Response.Redirect or Server.Transfer methods as they also call Response.End internally.

The resolution for this issue is -

  • Response.End : use HttpContext.Current.ApplicationInstance.CompleteRequest instead of Response.End.
  • Response.Redirect : use the overload Response.Redirect(String url, bool endResponse) where second parameter indicates if Response.End should be called or not.
  • Server.Transfer : use Server.Execute

While the requirement can be different and you may not want to just replace Server.Transfer with Server.Execute, handling the exception is a better solution in such a case. Also, calling ApplicationInstance.CompleteRequest or Response.Redirect with endResponse set to false, will still go through the complete page and application life cycle which may be expensive. In this case as well, when you may want the execution to be aborted immediately, instead of workarounding this issue as mentioned above, handle the ThreadAbortException and let all threads be aborted immediately.

This issue is documented in Microsoft's KB at http://support.microsoft.com/kb/312629/EN-US/ . It states, it applies to ASP.NET 1.0 and 1.1, but it applies to 2.0 as well.

Related Articles :

Friday, February 8, 2008

View and Generate XPS

If you are not using Windows Vista or MS Office 2007 on non Vista systems, you may add XPS support by downloading XPS Viewer and Writer from here - http://www.microsoft.com/whdc/xps/viewxps.mspx