Response.Redirect()ThreadAbortException间歇性地冒泡太高

时间:2010-07-09 14:37:05

标签: asp.net exception response.redirect

我理解(现在)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中执行重定向时抛出异常。为什么?我们怎么阻止这个?

3 个答案:

答案 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