Response.Redirect () ThreadAbortException Bubbling слишком высокий, периодически - PullRequest
2 голосов
/ 09 июля 2010

Я понимаю (сейчас), что Response.Redirect () и Response.End () генерируют исключение ThreadAbortException как дорогой способ уничтожения текущего потока обработки для эмуляции поведения методов ASP Classic Classic Response.End () и Response.Redirect .

Тем не менее.

В нашем приложении время от времени кажется, что исключительная ситуация слишком велика. Например, у нас есть страница, которая вызывается из клиентского javascript для возврата небольшой строки для отображения на странице.

protected void Page_Load(object sender, EventArgs e)
{
      // Work out some stuff.
      Response.Write(stuff);
      Response.End();
}

Обычно это работает, но иногда мы получаем пузырек исключения до уровня пользовательского интерфейса и получаем часть текста исключения, отображаемого на странице.

Точно так же, где у нас есть:

// check the login is still valid:
if(!loggedin) {
  Response.Redirect("login.aspx");
}

В некоторых случаях пользователь перенаправляется на login.aspx, в других он получает страницу с ошибкой ASP.NET и дамп стека (из-за того, как настроены наши серверы разработки).

т.е. в некоторых случаях response.redirect генерирует исключение вплоть до ВМЕСТО выполнения перенаправления. Зачем? Как мы можем это остановить?

Ответы [ 3 ]

1 голос
/ 21 августа 2013

Вместо этого вы можете использовать следующий рекомендуемый код, , как объясняется в этом ответе , чтобы исключить возникновение исключения:

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();
1 голос
/ 09 июля 2010

Вы пытались перегрузить метод Redirect по умолчанию и не завершать ответ?

if(!loggedin) { 
     Response.Redirect("login.aspx", false); 
} 
0 голосов
/ 04 ноября 2013

Поскольку я тоже искал ответ на этот вопрос, я отправляю то, что кажется мне полным решением, округляя два вышеупомянутых ответа:

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

...