これは自明の質問です。
何も問題がないのに、なぜこれが私の try キャッチにバブルするのですか?
ログに何百回も表示されるのはなぜですか?
初心者の質問であることはわかっていますが、このサイトが検索ランキングを獲得して新規ユーザーを獲得する場合は、彼らに質問する必要があります
これは自明の質問です。
何も問題がないのに、なぜこれが私の try キャッチにバブルするのですか?
ログに何百回も表示されるのはなぜですか?
初心者の質問であることはわかっていますが、このサイトが検索ランキングを獲得して新規ユーザーを獲得する場合は、彼らに質問する必要があります
これはおそらく Response.Redirect 呼び出しからのものです。説明については、このリンクを確認してください。
http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx
(ほとんどの場合、Response.Redirect(url, false) を呼び出すと問題が解決します)
ThreadAbortException の最も一般的な理由は、Response.End、Response.Redirect、または Server.Transfer の呼び出しです。Microsoft は、これらの関数の代わりに使用すべきいくつかの推奨関数を公開しています。
他の人が言ったように、Response.End() を呼び出すと発生します (2 番目のパラメーターとして false を渡さずに Response.Redirect を呼び出すと発生します)。これは設計どおりに機能しています。通常、Response.Redirect を呼び出す場合は、リダイレクトをすぐに実行する必要があります。詳細については、これを参照してください。
Response.Redirect でこの例外が発生する理由は、asp.net がこの API を Thread.Abort() で内部的に実装しているためです。このメソッドが呼び出されると、特別な ThreadAbortException がスローされます。この例外は、catch ブロックによって飲み込まれることはありません。各 catch ブロックの最後に再スローされます。
を内部的に使用する API が (少なくとも) 3 つあることを知っているのでThread.Abort
、より実用的な用語で答えたいと思います。
私たちにとって、このエラーは突然ログに記録され始めました。何が変わったのですか?サイトマップを扱っていた一部のデータベース プロシージャのバグを修正しました。
log4net ログは、X-Forwarded-For ヘッダー (私たちは NLB の背後にあります) が Googlebot の IP アドレス 66.249.78.x であることを示しました。これは、Google がサイトをより積極的に画像を探してクロールすることにつながるサイトマップの変更に関する私の理論を補強しました。
最初に、Googlebot だけがこの問題を引き起こした理由を突き止めました。他のどのクライアントも、コード パスが使用するものなどをトリガーしていませんでしResponse.Redirect
た。
そのため、HttpApplication.Error
ハンドラーにコードを追加して、すべてのヘッダーと詳細な出力をログに記録し、ログHttpResponse
にHttpContext
吐き出されたほとんどのデータをログに記録しました。
これにより、問題は Googlebot が iPhone ユーザー エージェント文字列を使用していることであり、それで武装していることがわかります。コードベースで「iPhone」を検索して、次のように思いつきました。
private void CheckIPhoneAccess() { ... }
そして、それはリダイレクトを使用します。
それについて何をすべきか?
この古いコードベースでは、すべてのResponse.Redirect
呼び出しにレトロ パッチを適用する価値はないので、アプリケーションのログ レベルを下げThreadAbortException
ます。
Googlebot のモバイル クローラーの動作を変更します。最初のヒットでのみリダイレクトし、その後 Cookie を読み取って画像を表示するため、サイトがモバイルに提供するものについて「嘘」をつくことはありません。Googlebot はその Cookie をキャッシュしていないようです。
完璧ではありませんが、サイトは再構築される予定です。おそらく Scala か何かを使用している別のチームによるものなので、実際には、これは良い選択だと思います。コメントを追加し、後で問題を再検討し、Response.SafeRedirect
このアドバイスをカプセル化する拡張機能を構築します。
Response.Redirect が System.Threading.ThreadAbortException を引き起こすのはなぜですか?
ルーク