2010-07-09 2 views
2

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

Однако.

Кажется, с перерывами в нашем приложении, что исключение пузырьков слишком велико. Например, у нас есть страница, которая вызывается из 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 генерирует исключение, вплоть до ВМЕСТО от выполнения перенаправления. Зачем? Как это остановить?

ответ

1

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

if(!loggedin) { 
    Response.Redirect("login.aspx", false); 
} 
+0

Проработал с некоторыми исследованиями, что нужно делать, но, все же хотите понять, почему иногда он пузырится исключение, а другие работают. – THEMike

+0

Почему вы используете Response.Write() для записи текста на страницу в любом случае? Это не рекомендуемый метод - это более классический ASP, чем ASP.NET. –

1

Вы можете использовать следующие лучшие практики кода вместо as explained by this answer, чтобы предотвратить исключение из происходит в первую очередь:

Response.Redirect(url, false); 
Context.ApplicationInstance.CompleteRequest(); 
+0

, но это не поддерживает мой запрос. он удаляется при переадресации страницы – Happy

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

Смежные вопросы