When I use Response.Redirect(...) to redirect my form to a new page I get the error:
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
An exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code
My understanding of this is that the error is being caused by the webserver aborting the remainder of the page the response.redirect was called on.
I know I can add a second parameter to Response.Redirect
that is called endResponse. If I set endResponse to True I still get the error but if I set it to False then I do not. I am pretty sure though that that means the webserver is running the rest of the page I redirected away from. Which would seem to be inefficient to say the least. Is there a better way to do this? Something other than Response.Redirect
or is there a way to force the old page to stop loading where I will not get a ThreadAbortException
?
I know I'm late, but I've only ever had this error if my
Response.Redirect
is in aTry...Catch
block.Never put a Response.Redirect into a Try...Catch block. It's bad practice
Edit
In response to @Kiquenet's comment, here's what I would do as an alternative to putting the Response.Redirect into the Try...Catch block.
I'd break up the method/function into two steps.
Step one inside the Try...Catch block performs the requested actions and sets a "result" value to indicate success or failure of the actions.
Step two outside of the Try...Catch block does the redirect (or doesn't) depending on what the "result" value is.
This code is far from perfect and probably should not be copied since I haven't tested it
There is no simple and elegant solution to the
Redirect
problem in ASP.Net WebForms. You can choose between the Dirty solution and the Tedious solutionDirty:
Response.Redirect(url)
sends a redirect to the browser, and then throws aThreadAbortedException
to terminate the current thread. So no code is executed past the Redirect()-call. Downsides: It is bad practice and have performance implications to kill threads like this. Also,ThreadAbortedExceptions
will show up in exception logging.Tedious: The recommended way is to call
Response.Redirect(url, false)
and thenContext.ApplicationInstance.CompleteRequest()
However, code execution will continue and the rest of the event handlers in the page lifecycle will still be executed. (E.g. if you perform the redirect in Page_Load, not only will the rest of the handler be executed, Page_PreRender and so on will also still be called - the rendered page will just not be sent to the browser. You can avoid the extra processing by e.g. setting a flag on the page, and then let subsequent event handlers check this flag before before doing any processing.(The documentation to
CompleteRequest
states that it "Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution". This can easily be misunderstood. It does bypass further HTTP filters and modules, but it doesn't bypass further events in the current page lifecycle.)The deeper problem is that WebForms lacks a level of abstraction. When you are in a event handler, you are already in the process of building a page to output. Redirecting in an event handler is ugly because you are terminating a partially generated page in order to generate a different page. MVC does not have this problem since the control flow is separate from rendering views, so you can do a clean redirect by simply returning a
RedirectAction
in the controller, without generating a view.i even tryed to avoid this, just in case doing the Abort on the thread manually, but i rather leave it with the "CompleteRequest" and move on - my code has return commands after redirects anyway. So this can be done
Also I tried other solution, but some of the code executed after redirect.
So if need to prevent code execution after redirect