我理解(现在)Response.Redirect()和Response.End()抛出一个ThreadAbortException作为杀死当前处理线程以模拟ASP Classic的Response.End()和Response.Redirect方法的行为的昂贵方法
然而
在我们的应用程序中间歇性地看起来异常泡沫太高了。例如,我们有一个从客户端javascript调用的页面,用于返回一个小字符串以显示在页面中。
protected void Page_Load(object sender, EventArgs e)
{
// Work out some stuff.
Response.Write(stuff);
Response.End();
}
这通常有效,但有时,我们会将异常冒泡到UI层并获取页面中显示的部分异常文本。
同样,我们拥有的其他地方:
// check the login is still valid:
if(!loggedin) {
Response.Redirect("login.aspx");
}
在某些情况下,用户被重定向到login.aspx,在其他情况下,用户获得ASP.NET错误页面和堆栈转储(因为我们的dev服务器的配置方式)。
即。在某些情况下,response.redirect会在INSTEAD中执行重定向时抛出异常。为什么?我们怎么阻止这个?
答案 0 :(得分:1)
您是否尝试重载默认的Redirect方法而不是结束响应?
if(!loggedin) {
Response.Redirect("login.aspx", false);
}
答案 1 :(得分:1)
您可以使用以下最佳实践代码as explained by this answer来防止异常发生:
Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();
答案 2 :(得分:0)
由于我也在寻找这个问题的答案,我正在向我发布一个完整的解决方案,将上述两个答案四舍五入:
public static void Redirect(this TemplateControl control, bool ignoreIfInvisible = true)
{
Page page = control.Page;
if (!ignoreIfInvisible || page.Visible)
{
// Sets the page for redirect, but does not abort.
page.Response.Redirect(url, false);
// Causes ASP.NET to bypass all events and filtering in the HTTP pipeline
// chain of execution and directly execute the EndRequest event.
HttpContext.Current.ApplicationInstance.CompleteRequest();
// By setting this to false, we flag that a redirect is set,
// and to not render the page contents.
page.Visible = false;
}
}
来源: http://www.codeproject.com/Tips/561490/ASP-NET-Response-Redirect-without-ThreadAbortExcep