【发布时间】:2018-01-25 17:17:48
【问题描述】:
尝试遵循 Response.Redirect 的最佳实践
Response.Redirect(someURl, false);
Context.ApplicationInstance.CompleteRequest();
如本 MSDN 博客所述:correct-use-of-system-web-httpresponse-redirect 这基本上是说:
使用不会导致线程中止的 CompleteRequest 重载 例外。
CompleteRequest 的 MSDN 页面说:
导致 ASP.NET 绕过 HTTP 管道中的所有事件和过滤 执行链,直接执行 EndRequest 事件。
但是,调用 CompleteRequest 后的所有页面事件仍然会触发。所以没有代码被跳过。这似乎与 MSDN 文档相矛盾。有解决方法吗?我误解了文档吗?
(博客文章确实说跳过是在页面级别,但 API 文档没有这么说。我猜答案只是文档具有误导性。)
您可以通过调试步进来测试一个相当简单的页面:
<asp:CheckBox ID="CheckBox0" runat="server" OnCheckedChanged="chk_CheckedChanged" />
<asp:CheckBox ID="CheckBox1" runat="server" OnCheckedChanged="chk_CheckedChanged" />
<asp:CheckBox ID="CheckBox2" runat="server" OnCheckedChanged="chk_CheckedChanged" />
<asp:CheckBox ID="CheckBox3" runat="server" OnCheckedChanged="chk_CheckedChanged" />
<asp:Button ID="btnRedirect" runat="server" Text="Click Me" OnClick="btnRedirect_Click" />
<asp:Label ID="lblNotes" runat="server" />
代码:
protected void Page_Load(object sender, EventArgs e)
{
lblNotes.Text += " Load " + DateTime.Now.ToString();
}
protected void Page_PreRender(object sender, EventArgs e)
{
lblNotes.Text += " PreRender " + DateTime.Now.ToString();
}
protected void chk_CheckedChanged(object sender, EventArgs e)
{
Response.Redirect("stackoverflow.com", false);
Context.ApplicationInstance.CompleteRequest();
}
protected void btnRedirect_Click(object sender, EventArgs e)
{
lblNotes.Text += " Btn " + DateTime.Now.ToString();
}
如果您选中所有复选框,然后按下按钮会触发许多事件。
【问题讨论】:
-
通过在 Response.Redirect 中使用 false 来结束当前线程的进一步执行。所以在某些情况下可能会导致问题。
-
@Ravikumar 我认为反过来。在 Response.Redirect 中使用 True 会结束当前线程的进一步执行,这会引发 ThreadAbort 异常。这是我试图避免的。这就是为什么我传错了。
-
你能分享更多代码或你的完整执行线程吗?
标签: c# asp.net redirect exception