2017-02-20 21 views
0

В методе OnClick для кнопки в веб-форме ASP.NET у меня есть вызов Response.Redirect() который заставляет систему, чтобы прервать нить с сообщением об ошибке:«Исключение брошено:« System.Threading.ThreadAbortException »в mscorlib.dll» при использовании Response.Redirect()

Exception thrown: 'System.Threading.ThreadAbortException' in mscorlib.dll 

Там в несколько вопросов, подобных этому здесь, используя свои решения я изменил:

Response.Redirect("~/UI/Home.aspx"); 

к

Response.Redirect("~/UI/Home.aspx", false); 
Context.ApplicationInstance.CompleteRequest(); 

Однако я все еще получаю ту же проблему. Используя отладчик, я пробежал код и все это успешно выполнялось до тех пор, пока я не вызвал Response.Redirect() ;.

OnClick Функция

protected void btnLogin_Click(object sender, EventArgs e) 
    { 
     SiteUser s = null; 
     try 
     { 
      string email = txtEmail.Text; 
      string pwd = txtPwd.Text; 
      s = DBConnection.login(email, pwd);     
     } 
     catch (Exception ex) 
     { 
      Console.Write(ex); 
      lblLoginError.Text = "Error logging in."; 
     } 
     if (s != null) 
     { 
      Session["UserSession"] = s; 
      Response.Redirect("~/UI/Home.aspx", false); 
      Context.ApplicationInstance.CompleteRequest(); 
     } 
     else 
     { 
      lblLoginError.Text = "User not found. Please check your details and try again."; 
     } 
    } 

Любые мысли о том, почему это может происходить?

+1

'Response.Redirect()' * действительно не должны * бросать это исключение, когда дано 'false' аргумент ... – David

+0

Возможный дубликат [Почему Response.Redirect вызывает System.Threading.ThreadAbortException ?] (http://stackoverflow.com/questions/2777105/why-response-redirect-causes-system-threading-threadabortexception) –

+0

@Am_I_Helpful Очень похожая проблема, но она не решена решениями там. –

ответ

1

Я видел эту проблему в прошлом. Теоретически, если вы используете этот код, он не должен произойти:

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

Это сказанное, я до сих пор есть это иногда, что действительно удивительно. Я предполагаю, что это иногда происходит в присутствии активного блока finally, чтобы сигнализировать код, чтобы начать очищать себя, хотя это не похоже на вас.

Лучшее исправление, которое я мог придумать, - это поймать ошибку и проигнорировать ее.

protected void btnLogin_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     SiteUser s = null; 
     try 
     { 
      string email = txtEmail.Text; 
      string pwd = txtPwd.Text; 
      s = DBConnection.login(email, pwd);     
     } 
     catch (Exception ex) 
     { 
      Console.Write(ex); 
      lblLoginError.Text = "Error logging in."; 
     } 
     if (s != null) 
     { 
      Session["UserSession"] = s; 
      Response.Redirect("~/UI/Home.aspx", false); 
      Context.ApplicationInstance.CompleteRequest(); 
     } 
     else 
     { 
      lblLoginError.Text = "User not found. Please check your details and try again."; 
     } 
    } 
    catch(System.Threading.ThreadAbortException) 
    { 
     //Do nothing. The exception will get rethrown by the framework when this block terminates. 
    } 
} 
+0

Спасибо за ответ! К сожалению, это, похоже, не устраняет проблему - она ​​по-прежнему просто перезагружает страницу входа. –

0

Это оказалось проблемой, что я вызван перенаправлять обратно, если сессия не содержит конкретный элемент в целевой странице, и в данном случае это не так! Исключение все еще бросается, но больше не вызывает видимых проблем.

Благодаря