【发布时间】:2019-07-30 00:41:35
【问题描述】:
我正在尝试将异步功能添加到现有的 asp.net 表单应用程序。但是我遇到了页面传输/重定向的问题。大部分现有代码重定向/传输的原因是由实用程序类或自定义控件等制成的。此外,在重定向/传输之后存在的代码进一步向上堆栈需要避免。原始代码利用重定向/传输内部调用 Response.End 并通过 ThreadAbortException 短路线程的代码执行。
对于 Server.Transfer 和 Response.Redirect,通过添加 Async="true" 使页面变为异步的页面会出现 ThreadAbortException 冒泡,并且浏览器最终会出现错误响应。我假设由于页面是异步的,当前页面请求在传输页面之前完成,而不是线程中止的同步方式,然后将开始处理传输页面。
当我使用 Response.Redirect("[somepagename]", false) 或 Server.Execute 时,它们会阻止当前响应结束,因此我在它们之后添加 ApplicationInstance.CompleteRequest,这会跳过以后的事件和处理程序管道处理。但是重定向/执行后的代码会继续,这会导致其他错误/问题。 (例如再次调用 Response.Redirect 以根据最初被 ThreadAbortException 跳过的逻辑转到不同的页面。)
我还尝试了 Server.Execute 和 ApplicationInstance.CompleteRequest 之间的 Response.FlushAsync,这在浏览器中看起来不错。 CompleteRequest 之后的异常不会显示给浏览器(至少在开发中),因为 FlushAsync 从传输页面发送缓冲响应。但是,如果第一页的刷新或继续代码执行首先完成,那仍然可能存在竞争条件。 CompleteRequest 之后的后续代码仍会执行,这可能会产生副作用。
原代码:
public static void GoToPage( string page, bool transfer )
{
if ( transfer ){HttpContext.Current.Server.Transfer( page, false ); }
else { HttpContext.Current.Response.Redirect( page ); }
}
【问题讨论】:
-
Paulo,我想举个例子,但我没有时间从我当前的项目中转移更多内容。以下链接是旧的,但就我对异步页面在重定向和传输以及 endrequest 中表现不同的问题的经验而言,我发现它是正确的。 “blogs.msdn.microsoft.com/tmarq/2009/06/25/…”。我不知道 ASP.NET 核心的行为是否有所不同。
标签: c# asp.net async-await response.redirect server.transfer