pankaj
pankaj

Reputation:

Error when I am redirecting page

I am getting an error:

"Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack."

when I am redirecting my page from one to another.

I am using this code:

try
{
    Session["objtwitter"] = obj_UserDetSumit;

           Response.Redirect("TwitterLogin.aspx");


    }
    catch (Exception ex)
    {

          lblStatus.Text = "Account Creation Failed, Please Try Again";


    }

And I got a solution and I tried also this Response.Redirect("home.aspx",false); It's not throwing an error but it's also not redirecting page.

Upvotes: 3

Views: 2284

Answers (5)

Binny
Binny

Reputation: 338

If you replace your code these line you won't get an exception in the first place

try
{
   Response.Redirect("home.aspx", False); 
   //Directs the thread to finish, bypassing additional processing
   Context.ApplicationInstance.CompleteRequest();
}
catch(Exception ex)
{
   // exception logging
}

Hope it helps

Upvotes: 0

Aaron Daniels
Aaron Daniels

Reputation: 9664

I'd try moving your Response.Redirect outside of the try catch block like this:

try
{
    Session["objtwitter"] = obj_UserDetSumit;
}
catch (Exception ex)
{
    lblStatus.Text = "Account Creation Failed, Please Try Again";
    return;
}

Response.Redirect("TwitterLogin.aspx");

Most people having this issue here resolved it with calling Response.Redirect("TwitterLogin.aspx", false); which doesn't explicitly kill the thread immediately. I'm not sure why this didn't work for you.

I think the issue is having your Response.Redirect inside of a try catch block. Calling Response.Redirect(url); calls Response.End();, which will throw a ThreadAbortException.

Make sure you're not trying to do any more processing after you do your redirect.

Using Reflector, you can see that Response.Redirect(url); calls Response.Redirect(url, true);

Passing true then calls Response.End(); which looks like this:

public void End()
{
    if (this._context.IsInCancellablePeriod)
    {
        InternalSecurityPermissions.ControlThread.Assert();
        Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
    }
    ....
}

Even though you don't have a finally in your code snippet, it may be trying to execute the "empty" finally, but can't because the thread is being aborted. Just a thought.

Upvotes: 0

David
David

Reputation: 73564

Reference here: http://msdn.microsoft.com/en-us/library/t9dwyts4.aspx

Response.Redirect calls the Response.End, which throws a ThreadAbortException, so you'd want to change your code to:

try
{
   Response.Redirect("home.aspx"); 
}
catch(System.Threading.ThreadAbortException)
{
   // do nothing
}
catch(Exception ex)
{
   // do whatever
}

Upvotes: 2

tsilb
tsilb

Reputation: 8037

First, make sure that you are working with a debug build and not a release build of your project. And second, make sure that you are debugging in mixed mode (both managed and native) so that you can see all of the current call stack.

Upvotes: 0

Keith Adler
Keith Adler

Reputation: 21178

Try - catch creates a thread around code within it in order to catch exceptions. When you Redirect you are effectively terminating execution of the thread thus causing an error since execution ended unnaturely (though this is by design). You should not Redirect from within try-catch and if you do you should use Response.Redirect( "some url", false ); and also specifically catch ThreadAbortException.

Upvotes: 4

Related Questions