This is one of the common runtime error reported by a lot of ASP.NET users.
Problem description
A successfully compiled code at runtime throws the following error during an operation:
“Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.”
Typically, this happens when the Response.End, Response.Redirect, or Server.Transfer method is used.
Assessment
This happens because current page execution is stopped and execution is sent to the Application_EndRequest event in the application’s event pipeline.
The duty of Response.End method is to stop the page execution and raise the EndRequest event. Thus, the line of code that follows Response.End is not executed. Error occurs with Response.Redirect and Server.Transfer methods too because both the methods call Response.End internally.
When a call is made to the Abort method to destroy a thread, the CLR throws a ThreadAbortException. It is a special exception that can be caught, but will automatically be raised again at the end of the catch block. When this exception is re-raised, the CLR executes all the finally blocks before ending the thread.
Using Visual Studio debugger, we can see the internal message for the exception as “Thread was being aborted.”
Resolution
Try one of the following that suits your workflow:
- Use a
try-catchstatement to catch the exception if needed
try {
// your code here
}
catch (System.Threading.ThreadAbortException ex){
// log/handle it
}
- For
Response.End:
InvokeHttpContext.Current.ApplicationInstance.CompleteRequestmethod instead ofResponse.Endto bypass the code execution to theApplication_EndRequestevent
- For
Response.Redirect
Use an overload,Response.Redirect(String url, bool endResponse)that passes false for endResponse parameter to suppress the internal call toResponse.End
Response.Redirect ("mynextpage.aspx", false);
- For
Server.Transfer
UseServer.Executemethod to bypass abort. WhenServer.Executeis used, execution of code happens on the new page, post which the control returns to the initial page, just after where it was called.
Refer:
Microsoft Support Article – 312629
MSDN: HttpResponse.Redirect Method
MSDN: HttpResponse.End Method
MSDN: ThreadAbortException Class
MSDN: HttpServerUtility.Execute Method
Conclusion
This is as designed. This exception has bad effect on Web application performance, which is why handling the scenario correctly is important.
Keep learning!
Thanks for posting such type of post.
Nice work please keep it up
Awesome, that clears that up nicely without the simple just put the second parameter to false that you usually get as a response.
add false in redirect only
it works with me