gpt4 book ai didi

C# ASP.NET 事件在调用 Context.ApplicationInstance.CompleteRequest 后仍然触发(Response.Redirect 相关)

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:29 29 4
gpt4 key购买 nike

尝试遵循 Response.Redirect 的最佳实践

Response.Redirect(someURl, false);
Context.ApplicationInstance.CompleteRequest();

如 MSDN 博客中所述:correct-use-of-system-web-httpresponse-redirect基本上说:

Use the CompleteRequest overload that does not cause a thread abort exception.

CompleteRequest 的 MSDN 页面说:

Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event.

然而,调用 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();
}

如果您勾选了所有复选框,然后按下按钮,就会触发许多事件。

最佳答案

看来你在想CompleteRequest()方法会终止页面的执行,类似于Response.Redirect(url, true)。然而,正如 John S Reid 在 this article 中所解释的那样,CompleteRequest只会结束ASP.NET应用程序生命周期中页面执行步骤之后发生的应用程序事件,根据ASP.NET的版本可能会发生变化。

页面仍将处理回发事件并呈现页面,但如果您对示例感兴趣,上面的文章有一个关于如何防止这种情况的示例。

下面是您的示例的代码:

private m_bIsTerminating = false;

protected void chk_CheckedChanged(object sender, EventArgs e)
{
Response.Redirect("Default2.aspx", false);
Context.ApplicationInstance.CompleteRequest();
m_bIsTerminating = true;
}

protected void btnRedirect_Click(object sender, EventArgs e)
{
lblNotes.Text = "button click event";
}

protected override void RaisePostBackEvent(IPostBackEventHandler
sourceControl, string eventArgument)
{
if (m_bIsTerminating == false)
base.RaisePostBackEvent(sourceControl, eventArgument);
}

protected override void Render(HtmlTextWriter writer)
{
if (m_bIsTerminating == false)
base.Render(writer);
}

如果您在选中复选框并单击按钮后进行调试,则复选框将引发回发事件,然后引发渲染,这两个事件都不会被调用。然后不处理按钮点击事件,发生重定向。

此外,我发现了这个 stackoverflow post这与此问题类似,并介绍了有关 CompleteRequest() 方法的更多信息。

关于C# ASP.NET 事件在调用 Context.ApplicationInstance.CompleteRequest 后仍然触发(Response.Redirect 相关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45732600/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com