Ошибка при перенаправлении страницы - PullRequest
3 голосов
/ 17 сентября 2009

Я получаю ошибку:

"Невозможно оценить выражение, поскольку код оптимизирован или собственный фрейм находится над стеком вызовов."

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

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

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); Он не выдает ошибку, но также не перенаправляет страницу.

Ответы [ 5 ]

4 голосов
/ 17 сентября 2009

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

2 голосов
/ 17 сентября 2009

Ссылка здесь: 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 голосов
/ 10 сентября 2015

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

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

Надеюсь, это поможет

0 голосов
/ 18 сентября 2009

Я бы попробовал переместить ваш Response.Redirect вне блока try catch следующим образом:

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

Response.Redirect("TwitterLogin.aspx");

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

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

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

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

Передача true затем вызывает Response.End();, который выглядит так:

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

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

0 голосов
/ 17 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...