ASP.NET 4.5 async-await和Response.Redirect

Jak*_*bRi 9 .net asp.net redirect asynchronous async-await

有什么方法可以Page_Load在使用时重定向(或任何其他ASP.NET事件)async- await?当然Redirect会抛出,ThreadAbortException但即使我抓住它try- catch它最终会出现错误页面.如果我调用Response("url", false)它不会崩溃,但我需要停止执行页面(渲染页面等),所以这不是解决方案.正如我注意到这两种方法的行为不同:

这最终导致ThreadAbortException(我假设任务同步结束):

protected async void Page_Load()
{
    await Task.Run(() => { });
    Response.Redirect("http://www.google.com/");
}
Run Code Online (Sandbox Code Playgroud)

这个在Response.Redirect之后继续:

protected async void Page_Load()
{
    await Task.Delay(1000);
    Response.Redirect("http://www.google.com/");
}
Run Code Online (Sandbox Code Playgroud)

我必须等待响应,但我正在尝试,即使我删除了await关键字(所以任务在后台运行,方法继续)它最终都是一样的.唯一有帮助的是删除async关键字 - 我认为async只能启用await,仅此而已?!

Jak*_*bRi 3

好的,我找到了如何处理的答案。

我在我的 Page 基类中创建了一个重定向方法包装器:

protected void Redirect(string url)
{
    this.isRedirecting = true;

    Response.Redirect(url, false);

    if (Context.ApplicationInstance != null)
        Context.ApplicationInstance.CompleteRequest();
}
Run Code Online (Sandbox Code Playgroud)

并覆盖Renderand RaisePostBackEvent

protected override void Render(HtmlTextWriter writer)
{
    if (this.isRedirecting)
        return;
}

protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
{
    if (!this.isRedirecting)
        base.RaisePostBackEvent(sourceControl, eventArgument);
}
Run Code Online (Sandbox Code Playgroud)

这就是窍门。在所有等待的任务完成之前, ASP.NET 4.5 不会触发该PreRenderComplete事件(= 不会在生命周期中继续)。