System.Threading."ThreadAbortException" - verursacht durch die Reaktion.Umleiten
In meinem Antrag fordere ich eine WebMethod von JavaScript, wo ich versuche, einen redirect zu einer Seite:
[WebMethod]
public string Logout() {
if (User.Identity.IsAuthenticated) {
HttpContext.Current.Response.Redirect("~/Pages/Logout.aspx");
}
return "";
}
Die aspx-Seite:
<input onclick="callLogout();" id="btn" type="button" value="Click Me" />
<asp:ScriptManager ID="ScriptManager" runat="server">
<Services>
<asp:ServiceReference Path="~/WebServices/EMSWebService.asmx" />
</Services>
</asp:ScriptManager>
<script type="text/javascript">
function callLogout() {
EMSApplication.Web.WebServices.EMSWebService.Logout(OnComplete, OnError);
}
function OnComplete(result) {
alert(result);
}
function OnError(result) {
alert(result.get_message());
}
</script>
Und ich bin immer:
Erste chance Ausnahme des Typs
'System.Threading.ThreadAbortException' ist in mscorlib.dllEine Ausnahme des Typs " System.Threading.ThreadAbortException' ist in
"mscorlib".die dll wurde aber nicht behandelt werden, in Benutzer-code
in meinem VS2010 Output-Fenster.
Warum bin ich immer diese exception und wie kann ich dies beheben?
InformationsquelleAutor Tapas Bose | 2012-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht nur die Ausnahme abfangen. Verwenden Sie die überlastung der Umleitung, die einen boolean-Wert. Übergeben Sie false, um anzugeben, dass Sie nicht möchten, dass das Gewinde abgebrochen.
Ich werde Ihnen helfen, sich selbst zu helfen: Hier ist die Dokumentation: msdn.microsoft.com/en-us/library/a8wa7sdt.aspx
bitte verwenden Sie nicht dieses Konzept.... falsche Antwort, weil Sie immer noch thread-Abbruch-und... dein code nach der Umleitung immer noch läuft!!!
nicht sicher, was Sie reden. Sie können angeben, dass Sie nicht wollen, einen thread abzubrechen. Das ist der Sinn dieser Antwort. Sie brauchen natürlich, um sicherzustellen, dass Sie am Ende der Verarbeitung selbst jetzt, dass Sie nicht Abbrechen, den thread.
InformationsquelleAutor usr
Der ideale Weg, um redirect-Aufruf
Response.Redirect(someUrl, false)
und rufen Sie dannCompleteRequest()
Vorbei false
Response.Redirect(...)
wird verhindert, dass dieThreadAbortException
ausgelöst wird, jedoch ist es noch wichtig zu Ende der Lebenszyklus der Seite durch den AufrufCompleteRequest()
.Beachten Sie, dass, wenn die
Response.Redirect(...)
- Methode aufgerufen wird, wird ein neuer thread erzeugt wird, mit einem ganz neuen Seite-Lebenszyklus zu handhaben, die neue umgeleitet Antwort. Wenn die neue Reaktion beendet ist, ruft esResponse.End()
auf die original-Antwort, die schließlich löst eineThreadAbortException
und wirft dieEndRequest
Veranstaltung. Wenn Sie verhindernResponse.End()
aus aufgerufen (durch übergabe von false aufResponse.Redirect
), dann müssen Sie rufen SieCompleteRequest()
die:Wort der Vorsicht:
Wenn Sie anrufen
Response.Redirect(someUrl, false)
so dass der code weiter ausgeführt werden, möchten Sie vielleicht ändern Sie Ihren code so, dass die Verarbeitung ordnungsgemäß beendet. Manchmal ist dies so einfach wie das hinzufügen einesreturn
um eine void-Methode aufrufen. Allerdings, wenn Sie tief in einem call-stack, das ist viel schwieriger und wenn Sie nicht wollen, mehr code ausgeführt, es könnte sein leichter zu passieren wahr wieResponse.Redirect(someUrl, true)
absichtlich erwarten, dass dieThreadAbortException
- die übrigens nicht schlecht ist, sollte man erwarten, dass er währendResponse.Redirect(...)
undServer.Transfer(...)
Anrufe.ThreadAbortException kann Nicht Gestoppt Werden kann Durch das Abfangen der Ausnahme
Den ThreadAbortException ist nicht Ihre gewöhnliche Ausnahme. Auch wenn Sie wickeln Sie Ihren code in einen try-catch-block, der ThreadAbortException wird sofort ausgelöst, nachdem die finally-Klausel.
Oft das, was ich gesehen habe im code einen try-catch-block um Antwort.Redirect, das sich von Ausnahmen, die nicht ThreadAbortExceptions (da Sie erwarten, dass diese). Beispiel:
InformationsquelleAutor Sam
Dies ist eine standard-exception verursacht durch
Response.Redirect
gefangen, nur, wenn Sie eine explizitetry-catch
über einen block, der nicht die Weiterleitung. ASP.NET wirft es bei der Weiterleitung, so dass kein code ausgeführt wird, nachdem Sie umleiten.Eine Lösung ist das hinzufügen einer leeren catch-schlucken dieses Besondere Ausnahme
Response.End
innerhalb einertry-catch
block.InformationsquelleAutor Wiktor Zychla