2009-09-16 2 views
3

Я получаю сообщение об ошибке:Ошибка, когда я перенаправлять страницу

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

когда я перенаправлять свою страницу от одного к другому.

Я использую этот код:

try 
{ 
    Session["objtwitter"] = obj_UserDetSumit; 

      Response.Redirect("TwitterLogin.aspx"); 


    } 
    catch (Exception ex) 
    { 

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


    } 

И я получил решение, и я попытался также это Response.Redirect("home.aspx",false); Это не бросает ошибку, но это также не перенаправлять страницу.

+0

Пожалуйста, помогите мне для этой проблемы я didnot получить любое решение в любом место. – 2009-09-18 02:02:27

ответ

4

Try-catch создает поток вокруг кода внутри него для исключения исключений. Когда вы перенаправляете, вы фактически завершаете выполнение потока, тем самым вызывая ошибку, так как выполнение закончилось ненамеренно (хотя это по дизайну). Вы не должны перенаправлять изнутри try-catch, и если вы это делаете, вы должны использовать Response.Redirect («некоторый url», false); а также специально поймать ThreadAbortException.

+0

Это не работает, пожалуйста, предложите другой способ решить эту проблему. – 2009-09-17 15:55:24

0

Во-первых, убедитесь, что вы работаете с отладочной сборкой, а не с версией вашего проекта. И, во-вторых, убедитесь, что вы отлаживаете смешанный режим (как управляемый, так и собственный), чтобы вы могли видеть весь текущий стек вызовов.

2

Ссылка здесь: http://msdn.microsoft.com/en-us/library/t9dwyts4.aspx

Response.Redirect называет response.end, который бросает ThreadAbortException, так что вы хотели бы изменить свой код:

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

Плюс я думаю, вы должны использовать эту надгрузку Response.Redirect (string url, bool endResponse); – Nirlep

+0

спасибо за это, но оба этого не работают, пожалуйста, скажите мне по-другому – 2009-09-16 22:54:35

+0

это не работает, пожалуйста, предложите другой способ решить эту проблему. – 2009-09-17 15:56:24

0

Я бы попытайтесь переместить Response.Redirect вне блока попытка поймать так:

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

Response.Redirect("TwitterLogin.aspx"); 

Большинство людей, имеющих этот вопрос here решить его с вызовом Response.Redirect("TwitterLogin.aspx", false);, который явно не убивает поток немедленно. Я не уверен, почему это не сработало для вас.

Я думаю, что проблема связана с вашим Response.Redirect внутри блока catch try. Вызов Response.Redirect(url); звонит Response.End();, который выдает ThreadAbortException.

Удостоверьтесь, что вы не пытаетесь сделать больше обработки после перенаправления.

Используя Reflector, вы можете увидеть, что Response.Redirect(url); звонки Response.Redirect(url, true);

Передача верно, то называет Response.End();, который выглядит следующим образом:

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

Даже если вы не имеете, наконец, в фрагменте кода, он может попытаться выполнить «пустой», наконец, но не может, потому что поток прерывается. Просто мысль.

0

Если заменить код этих строк, вы не получите исключение в первой очереди

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

Надеется, что это помогает

Смежные вопросы