2008-08-15 7 views

Antwort

18

von einem Response.Redirect kommenden Anruf Dies wird wahrscheinlich ziehen bekommen. Überprüfen Sie diesen Link für eine Erklärung:

http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx

(In den meisten Fällen ruft Response.Redirect (url, false) behebt das Problem)

+5

Beachten Sie, dass der obige Link unterbrochen ist – JoshL

+3

Erics Antwort ist korrekt, aber Sie sollten wissen, dass die Übergabe des falschen Parameters bedeutet, dass der aktuelle Thread nicht abgebrochen wird, d. H. Der Code nach Response.Redirect wird ausgeführt. – CodeClimber

1

Wie andere gesagt haben, tritt es auf, wenn Sie Response.End() aufrufen (was beim Aufruf von Response.Redirect ohne Übergabe von false als zweiten Parameter auftritt). Dies funktioniert wie vorgesehen; Wenn Sie Response.Redirect aufrufen, möchten Sie normalerweise, dass die Umleitung sofort erfolgt. Sehen Sie diese für weitere Informationen:

Response.Redirect and the ThreadAbortException

0

Zu wissen, dass es (mindestens) drei APIs, die intern Thread.Abort verwenden, würde Ich mag mehr Praxis beantworten in, wie man herausfinden, was zu tun ist .

Für uns wurde dieser Fehler plötzlich protokolliert. Was hat sich geändert? Wir haben einen Fehler in einer Datenbankprozedur behoben, die sich mit Sitemaps beschäftigt.

Die log4net Protokolle zeigten die X-Forwarded-For-Header (wir sind hinter einem NLB) war Googlebot IP-Adresse 66.249.78.x, die meine Theorie über die Änderung der Sitemap zu Google Crawlen unsere Website aggressiver suchen für Bilder.

Die erste Sache war, herauszufinden, warum nur der Googlebot dieses Problem verursachen konnte. Kein anderer Client hat ausgelöst, welcher Codepfad Response.Redirect oder was auch immer verwendet.

So in den HttpApplication.Error Handler, fügte ich einigen Code zusätzlichen detaillierte Ausgabe mit allen Header zu protokollieren, und die meisten Daten in den HttpResponse und HttpContext loggen gespuckt.

Diese lassen Sie mich sehen, dass das Problem war, dass der Googlebot ein iPhone-User-Agent-String verwendet und damit bewaffnet, konnte ich die Code-Basis für „iPhone“ suchen und kommen mit:

private void CheckIPhoneAccess() { ... } 

Und das verwendet eine Umleitung.

Was kann ich dagegen tun?

Nun, für diese alte Codebasis lohnt es sich nicht, alle Response.Redirect Aufrufe zu retro-patchen, also werde ich den Logging-Level für ThreadAbortException für die Anwendung senken.

Ich werde das Verhalten für die mobilen Crawler Googlebot ändern, dass nicht führen zu ‚Lügen‘ würde über das, was unsere Website dient, da es Umleitungen auf dem ersten Treffer nur auf Handys, es anschließend ein Cookie liest und zeigt das Bild. Der Googlebot scheint diesen Cookie nicht zwischenzuspeichern.

Es ist nicht perfekt, aber die Website soll wieder aufgebaut werden. wahrscheinlich von einem anderen Team, das Scala oder so verwendet, also denke ich, dass dies eine gute Wahl ist. Ich werde Kommentare hinzufügen und später die Frage erneut kann, bauen eine Response.SafeRedirect Erweiterung, die diesen Rat kapselt:

Why Response.Redirect causes System.Threading.ThreadAbortException?

Luke

+0

Der HaveSeenIPhonePromo-Cookie wurde nie hinzugefügt, daher wurde der Googlebot-Mobile ständig umgeleitet. Das war die Ursache. –

0

Der Grund, warum Response.Redirect diese Ausnahme geben ist asp.net Implementieren Sie diese API intern mit Thread.Abort(). Wenn diese Methode aufgerufen wird, wird eine spezielle ThreadAbortException ausgelöst. Diese Ausnahme wird von keinem catch-Block verschluckt. Es wird am Ende jedes Fangblocks erneut geworfen.