【问题标题】:ASP.NET Response.Redirect() issue not working at false parameterASP.NET Response.Redirect() 问题在错误参数下不起作用
【发布时间】:2013-03-10 00:36:12
【问题描述】:

Response.Redirect() 遇到问题并收到错误消息:

无法评估表达式,因为代码已优化或本机框架位于调用堆栈顶部

我在 Google 上搜索并在这里找到了一些主题,例如: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack

人们提议将第二个参数设置为 false 值以使其工作,例如:

Response.Redirect("PageName.aspx", false);

但至于我的程序,它并没有重定向到新的程序……它只是继续停留在这个页面上。

我在其他页面上做了一个断点,我想重定向它。但是断点没有任何事件可以捕获。看起来它只是没有将请求发送到另一个页面。

我的代码比较大,所以我没有在这里发布代码,而是在 ideone: http://ideone.com/bQzCJd

Redirect() 方法在 57th line 上,其中:

  • 如果第二个参数设置为true,则发生异常
  • 如果设置为false,则什么也不会发生

我必须做些什么来修复它?

【问题讨论】:

  • 为什么不使用Response.Redirect("PageName.aspx") 而在try/catch 之后使用?使用 bool 变量,例如mustRedirect 可以在重定向之前检查。
  • @TimSchmelter 因为将来我想重定向到几个页面。它可能会重定向到个人内阁,它可能会收到通知,这样的 IP 被 DB 禁止,我必须重定向到某些禁止区域等...
  • @OlegOrlov 查看此答案和代码stackoverflow.com/a/14641145/159270
  • @Aristos 感谢有关黑客问题的有趣信息,如果设置为 false 值,但在我的代码中,如果我设置为 true,我就会遇到这样的异常。我该如何解决?
  • @OlegOrlov 我输入了忽略此异常的代码,并在链接上对此进行了更多解释。

标签: asp.net redirect expression response evaluate


【解决方案1】:

如果第二个参数设置为 true,则发生异常

是的,ThreadAbortException,因为您 redirectTry-Catch 中。

为什么不使用Response.Redirect("PageName.aspx") 而在try/catch 之后使用?使用 bool 变量,例如redirectCabinet 您可以在重定向之前检查:

bool redirectCabinet = false;
try
{
    // ...
    if (tmpStr != String.Empty)
    {
        if (pageHandler.Request.HttpMethod == "GET")
        {
            if (pageHandler.Request.Params["method"] == "checkAuth")
            {
                // ...
                bool userExists = Convert.ToBoolean(mysqlObject.MakeScalar(ref mysqlConn,
                if (userExists)
                {
                   // ...
                    redirectCabinet = true;
                    //Response.Redirect("Cabinet.aspx");
                }
                // ...
            }
        }
        //....
    }
} catch (Exception exc)
{
    exc.ToString();
}

if(redirectCabinet)
    Response.Redirect("Cabinet.aspx");

【讨论】:

    【解决方案2】:

    我建议你避免Abort Exception,并使用true结束执行并进入下一页。

    try
    {
        // this is throw the ThreadAbortException exception
        Response.Redirect("SecondEndPage.aspx", true);
    }
    catch (ThreadAbortException)
    {
        // ignore it because we know that come from the redirect
    }
    catch (Exception x)
    {
    
    }
    

    类似:https://stackoverflow.com/a/14641145/159270

    【讨论】:

    • 谢谢,但是如果有一个捕获块,我将如何重定向。我只是会陷入 catch (ThreadAbortException) { } 块,什么都不会发生……但我需要准确地修复重定向过程。
    • @OlegOrlov 不是这样的,true 的重定向是发送重定向命令并停止执行。试试吧。这段代码有效:) 你可能需要一些函数返回,也许在 ThreadAbortException 上。 Tim 解决方案类似,带有一个标志。
    • 事件与蒂姆的解决方案它没有重定向,上面我已经发布了带有布尔值的项目变体,你可以看看。 81.176.229.82/WebApplication2.zip 我已经准备好你建议的变体......但它也没有重定向,我不明白“为什么?”,我不想使用 JavaScript 进行重定向,因为它会对应用程序不利。
    • @OlegOrlov 我看到了你的代码,你确定它被调用了吗?我没有看到任何使它不重定向的东西。
    • 是的,我确定,因为这两种方法(蒂姆和你的)都没有重定向到所需的页面。
    【解决方案3】:

    即使使用 cmets 中提供的解决方案,它也无法正常工作,但如果使用 true endRequest 重定向,它应该可以工作。

    像这样:

    if(redirectCabinet)
        Response.Redirect("Cabinet.aspx",true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2011-08-21
      • 2017-04-09
      • 2013-12-07
      相关资源
      最近更新 更多