【问题标题】:Response.Redirect not ending executionResponse.Redirect 未结束执行
【发布时间】:2008-12-16 21:46:23
【问题描述】:

我有 Default.aspx 页面,它继承自 BasePage.cs,继承自 System.Web.UI.Page。 BasePage 是我在每个页面加载时必须执行的一些常见操作的地方。

在 BasePage 中,假设我正在检查 X。如果 X=1,那么我将立即重定向到我的“Discontinued.aspx”页面并停止执行 BasePage。如果我发现 X=1,我会说:

HttpContext.Current.Response.Redirect("Discontinued.aspx", true);

我希望重定向停止执行 BasePage 并立即跳出 - 因此上述语句中的“真” - 据我了解,这应该停止当前页面的执行。问题是,它没有。我期待重定向抛出“线程中止异常”。

当我在调试模式下运行时,它会继续单步执行,就好像它不只是重定向和离开一样。

但是重定向仍然开始 - 一旦我完成了 BasePage 的其余部分,“Discontinued”页面然后开始加载作为重定向的结果。

我的重定向不会终止 BasePage 的执行是否有原因?

【问题讨论】:

  • 另外,作为旁注,当第一个 Response.Redirect 没有让我们跳出 BasePage.cs 时,稍后尝试重定向时会遇到标头已发送的错误 - 显示重定向是已启动,但尚未完全执行。

标签: asp.net response.redirect


【解决方案1】:

Response.Redirect 的第二个参数是endResponse,但是工具提示显示“指示当前页面的执行是否应该终止”。这是一种误导,因为当变量为真时,页面的执行实际上并没有终止。它将完成运行任何代码。然而,不同的是,Render 事件被取消,并且响应立即与对象移动的标题一起刷新。

您需要手动退出任何方法,Response.Redirect / Response.End 不会为您执行此操作。此外,如果您需要条件来查看页面是否已被重定向,请查看 Response.IsRequestBeingRedirected。

【讨论】:

  • 好东西要知道 - 谢谢。被不准确的工具提示挫败!
  • 好答案 - 除了你忘了提到你必须在重定向后返回函数;-)
【解决方案2】:

您是否正在退出调用重定向的函数,例如

...redirect(stopit,true);
return;

?

【讨论】:

  • 我加了一个“return;”在 Response.Redirect 之后,这让我跳出了这个功能,并完成了我想要的。所以谢谢。
【解决方案3】:

可能您在 try{}catch{} 块内调用 Response.Redirect 方法,通过在该块外调用来尝试它,您会发现它不会失败。 更多信息: http://www.velocityreviews.com/forums/t72105-responseredirect-in-a-trycatch.html 希望这会有所帮助。

【讨论】:

  • 更好: HttpContext.Current.Response.Redirect("Discontinued.aspx", false);返回; 希望这会有所帮助。
  • 在我的应用程序的其他地方,我确实期望 System.Threading.ThreadAbortException,并且可以通过什么都不做来简单地处理它。所以我不害怕这个例外——事实上,这是我所期望和想要的。它只是不会抛出它......也许是因为我在 BasePage 而不是 aspx?
  • 顺便说一句,正如您在上面看到的,您的第二个想法原来是要走的路。谢谢。
  • 酷,很高兴您找到了答案。干杯。
【解决方案4】:

您可以抛出异常,这将退出代码执行,但仍会重定向:

HttpContext.Current.Response.Redirect("/login", true);
throw new Exception("Unauthorized Access");

【讨论】:

  • 呵呵,其实挺聪明的。
【解决方案5】:

我将为此投反对票!诅咒我的无知...

显然您可以尝试在重定向后添加以下行(如递归所指出的那样),

response.end()

但也许 response.redirect 没有立即引起重定向的原因是你有响应缓冲(默认)并且页面处理直到缓冲区被刷新后才结束。如果这是真的(诚然我也懒得尝试),那么添加以下行也可以解决您的问题。

response.flush()

【讨论】:

  • 我确实有“HttpContext.Current.Response.BufferOutput = true;”在那里,所以你可能是对的。 Response.End() 没有停止任何事情,所以我不得不选择“return”;选项。
【解决方案6】:

对于无条件终止,您可以尝试

Response.End()

【讨论】:

  • 我先尝试了这个,但它似乎并没有阻止任何事情。不过谢谢你的想法。
猜你喜欢
  • 2013-10-16
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多