Wyjątek ThreadAbortException występuje w przypadku korzystania z elementów Response.End, Response.Redirect lub Server.Transfer

Ten artykuł ułatwia rozwiązanie błędu ThreadAbortException występującego w przypadku użycia polecenia Response.End, Response.Redirectlub Server.Transfer.

Oryginalna wersja produktu: ASP.NET w wersji .NET Framework 4.5.2, ASP.NET na .NET Framework 3.5 dodatku Service Pack 1
Oryginalny numer KB: 312629

Symptomy

Jeśli używasz Response.Endmetody , Response.Redirectlub Server.Transfer , występuje wyjątek ThreadAbortException. Możesz użyć instrukcji , try-catch aby złapać ten wyjątek.

Przyczyna

Metoda Response.End kończy wykonywanie strony i przenosi wykonanie do zdarzenia Application_EndRequest w potoku zdarzeń aplikacji. Poniższy wiersz kodu Response.End nie jest wykonywany.

Ten problem występuje w metodach Response.Redirect i Server.Transfer , ponieważ obie metody wywołują metodę Response.End wewnętrznie.

Rozwiązanie

Aby obejść ten problem, użyj jednej z następujących metod:

  • W przypadku Response.End metody wywołaj HttpContext.Current.ApplicationInstance.CompleteRequest metodę , zamiast Response.End pomijać wykonywanie kodu w zdarzeniu Application_EndRequest .

  • W przypadku Response.Redirectpolecenia użyj przeciążenia Response.Redirect(String url, bool endResponse), który przekazuje wartość false dla parametru endResponse, aby pominąć wywołanie wewnętrzne do Response.Endelementu . Przykład:

     Response.Redirect ("nextpage.aspx", false);
    

    Jeśli użyjesz tego obejścia, zostanie wykonany poniższy kod Response.Redirect .

  • W przypadku Server.Transferpolecenia użyj Server.Execute metody zamiast tego.

Mimo że ASP.NET obsługuje ten wyjątek, możesz użyć try-catch instrukcji , aby złapać ten wyjątek. Przykład:

try
{
    Response.Redirect("nextpage.aspx");
}
catch (Exception ex)
{
    Response.Write (ex.Message);
}

Dodaj punkt przerwania w wierszu Response.Write i zwróć uwagę, że ten punkt przerwania został trafiony. Podczas badania wyjątku należy zauważyć, że występuje wyjątek ThreadAbortException.