It is often overlooked, but Response.Redirect has an overloaded method which has two parameters.
The first is like the overloaded version which gets only one parameter – the URL to redirect to.
The second is whether to end the request now or let it complete and only then redirect.
By default when calling the first version:
It will actually call the following code:
This means that the request will end right after the execution of the Response.Redirect function and no other code that is hooked to events that occur after the place in which you called Response.Redirect will execute.
For example, if you have a certain code at the Page_PreRender event and you are calling Response.Redirect in the Page_Load event (either on the page or in a control on the page), without using the overload version of Response.Redirect that gets two arguments and setting the second argument to “false”, the code in the Page_PreRender event will never get called.
While this seems very trivial, there are a lot of bugs that sometimes occur because people forget the Response.Redirect with one parameter stops the execution of the request.
Every time you call Response.Redirect, stop for a second and think if you really want to end the request at that point or let it continue to process until it finishes.
If you want it to continue processing the page and perform the redirection after the processing is done use the following code:
Thinking 2 seconds before writing a Reponse.Redirect code can save a lot of minutes debugging and figuring out that you never reach the other code because the request ended at the Response.Redirect call.
UPDATE: Fixed the last sample, thanks to Eber Irigoyen