Was könnte ThreadAbortException verursachen, wenn Sie HttpWebRequest.GetResponse () verwenden

Ich lebe wegen dieser Situation in Albträumen, ich habe eine HttpWebRequest.GetResponse, die mir weiterhin eine ThreadAbortException gibt, die dazu führt, dass die ganze App untergeht.

Wie kann ich vermeiden, oder zumindest damit umgehen, würde Thread.ResetAbort() in einem solchen Fall nützlich sein?

Um mehr zu erklären, hier ist ein grobes Codebeispiel:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://someurl.com/");
HttpWebResponse resp = req.GetResponse();

Jetzt löst die letzte Zeile die ThreadAbortException aus, möglicherweise weil die Anfrage abgelaufen ist, was in Ordnung ist, aber ich möchte keine ThreadAbortException in meiner ASP.NET 2.0-App erhalten, weil sie sie tötet. Die ThreadAborException kann nicht mit try/catch abgefangen werden, die einzige Möglichkeit, dies zu umgehen, ist die Verwendung von Thread.ResetAbort (), das auch seine eigenen schlechten Effekte hat, es wird den Thread am Leben erhalten und Gott weiß nur wie lange.

12
Versuchen Sie eine System.Exception in der 2. Zeile zu finden und sehen Sie, welche Art von Ex geworfen wird.
hinzugefügt der Autor StingyJack, Quelle
Sie können ThreadAbortException abfangen, Sie müssen nur richtig damit umgehen. ResetAbort() ist das Richtige, wenn Sie fertig sind. Siehe msdn.microsoft.com/de-de/library/&hellip ; für mehr.
hinzugefügt der Autor Bob King, Quelle

4 Antworten

Von dem, was Sie sagen, scheinen Sie eine ausgehende WebRequest an eine externe Ressource aus der Verarbeitung einer eingehenden Anfrage an eine ASP.NET-Anwendung. Hier sind (mindestens) zwei Timeouts relevant:

  • WebRequest.Timeout (Standard 100000ms = 100s) gibt das Zeitlimit für die Ausführung der ausgehenden WebRequest an. Wenn dieses Zeitlimit abläuft, sollten Sie eine WebException erhalten - das ist also nicht Ihr Problem.

  • Die HttpRuntime, die Ihre eingehende Anfrage verarbeitet, hat ein Ausführungszeitlimit: der Standardwert gemäß MSDN ist 110s für .NET 2.0 oder höher, 90s für .NET 1.x. Wenn dieses Zeitlimit abgelaufen ist, erhalten Sie eine ThreadAbortException. Es sieht so aus, als ob das passiert.

In .NET 1.x, you'd expect this, because the default HttpRuntime executionTimeout is less than WebRequest.Timeout. In .NET 2.0, you'd expect this with the default timeouts if you have already spent >10s before making the outgoing WebRequest (e.g. if you have more than one outgoing WebRequest from within the same incoming request).

Ich würde Ihnen entweder vorschlagen:

  • Verringern Sie das WebRequest.Timeout für ausgehende Anfragen und behandeln Sie WebException oder

  • Wenn die ausgehenden Anforderungen wirklich so lange dauern können, erhöhen Sie das httpRuntime-Ausführungszeitlimit, wie in MSDN .

12
hinzugefügt
httpRuntime.executionTimeout war der Schuldige in meinem Szenario - danke!
hinzugefügt der Autor RobSiklos, Quelle

I had this problem with using Response. Check out this article for some workarounds. http://support.microsoft.com/kb/312629

Werfen Sie auch einen Blick auf diese MSDN-Dokumentation im Abschnitt für WebException und Bemerkungen. http://msdn.microsoft.com/de-de us/library/system.net.httpwebrequest.gerresponse.aspx

Diese Ausnahme kann abgefangen werden ... Wenn Sie Probleme haben, die richtige zu finden, sollten Sie versuchen, eine allgemeine Ausnahme (system.Exception) abzufangen, und von dort sollte der Stack-Trace Ihnen den spezifischen Typ (HttpException, WebException, etc) mitteilen tatsächlich fangen.

2
hinzugefügt

Unsere Anwendung hat ThreadAbortException die ganze Zeit b/c von Response.Redirect ("url") Anrufe. Die App wurde nie geschlossen, höchstwahrscheinlich b/c wurde die Ausnahme irgendwann abgefangen und blieb aktiv.

Übrigens wird Response.Redirect ("url", false) verhindern, dass die Antwort mit der Ausnahme endet. Andrew's Post verweist auf ähnliche Problemumgehungen für verschiedene Verwendungen der Antwortklasse.

0
hinzugefügt
Das ist genau (Response.Redirect (url) ruft Response.End auf, das eine ThreadAbortException auslöst), aber nicht relevant für die Situation des OP.
hinzugefügt der Autor Joe, Quelle

Ich habe beide Probleme von Andrew und "ForCripesSake" gesehen.

Eine weitere Möglichkeit für Ihre ThreadAbortException ist Code, der außerhalb des Seitenanforderungslebenszyklus auf der Serverseite ausgeführt wird, z. B. HttpModules und HttpHandlers. Alle Ausnahmen, die in einem Modul oder Handler ausgelöst werden, wechseln nicht zum standardmäßigen unbehandelten Ausnahmemechanismus in ASP.Net und können den Thread zum Absturz bringen.

Es gibt ein paar Ausnahmen, die in ASP.net oder der CLR im Allgemeinen gemäß diesem Artikel nicht einfach gehandhabt werden können:

Best Practices für die Zuverlässigkeit

Nicht sicher, ob es sich auf den Client-Code bezieht, den Sie in Ihrer Frage aufgelistet haben, aber es könnte verwandt sein.

Ich hoffe, das hilft!

0
hinzugefügt