【问题标题】:Error when I am redirecting page重定向页面时出错
【发布时间】:2009-09-16 22:04:33
【问题描述】:

我收到一个错误:

“无法计算表达式,因为代码已优化或本机框架位于调用堆栈顶部。”

当我将我的页面从一个重定向到另一个时。

我正在使用此代码:

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); 它不会引发错误,但也不会重定向页面。

【问题讨论】:

  • 请帮我解决这个问题,我在任何地方都没有得到任何解决方案。

标签: asp.net redirect


【解决方案1】:

Try - catch 围绕其中的代码创建一个线程以捕获异常。当您重定向时,您实际上是在终止线程的执行,从而导致错误,因为执行不自然地结束(尽管这是设计使然)。您不应该从 try-catch 中重定向,如果这样做,您应该使用 Response.Redirect("some url", false);并专门捕获 ThreadAbortException。

【讨论】:

  • 这不起作用,请提出另一种解决方法。
【解决方案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
}

【讨论】:

  • 另外我认为你应该利用这个过载 Response.Redirect(string url, bool endResponse);
  • 谢谢,但这两个都不起作用,请告诉我其他方法
  • 这不起作用,请提出另一种解决方法。
【解决方案3】:

首先,确保您使用的是调试版本,而不是项目的发布版本。其次,确保您在混合模式(托管和本机)下进行调试,以便您可以看到所有当前调用堆栈。

【讨论】:

    【解决方案4】:

    我会尝试将您的 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");
    

    大多数遇到此问题的人here 通过调用Response.Redirect("TwitterLogin.aspx", false); 解决了它,这不会立即明确终止线程。我不确定为什么这对你不起作用。

    我认为问题在于将您的 Response.Redirect 放在 try catch 块中。调用Response.Redirect(url); 调用Response.End();,这将抛出ThreadAbortException

    确保您在进行重定向后不再尝试进行任何处理。

    使用Reflector,可以看到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));
        }
        ....
    }
    

    即使您的代码 sn-p 中没有 finally,它也可能试图执行“empty” finally,但由于线程被中止,所以不能。只是一个想法。

    【讨论】:

      【解决方案5】:

      如果你替换你的代码这些行,你首先不会得到异常

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2016-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多