プロジェクトが巨大になってくると、一人の人間がコード全体を熟知しているという事はまずあり得ない。他人の書いたコードはおろか、自分の書いたコードでさえ記憶に残っているか怪しいものだ。
ASP.NET の場合、フレームワークが順にイベントを発行し、ユーザーコードはそのイベントを捕まえて処理を行うという形式なので、デバッガで順にコードを追う事は難しい(Windows アプリケーションもある意味で同様だが)。ユーザーコントロールや各種ライブラリが相当数あり、そのどれかに、ある条件下で HTTP Redirect されるコードがあると問答無用で処理が中断されてしまうため、更にデバッグの難度は増す。
テクニックという程、偉そうなものではないが、「ある条件下で HTTP Redirect される場所」がどこかというのを簡単に探せる方法を紹介しよう。
ASP.NET では「HTTP Redirect とはスレッドの中断」の事である。要するに ThreadAbortException がスローされる。これを知っていれば「HTTP Redirect 要求をサーバーが行ったとき」にデバッガで止める事ができる。
どうするか。
Visual Studio のデバッグの設定で「例外スロー時の挙動」を変更できる。例外がスローされたとき、ハンドリングしていない場合にデバッガで止めるのか、それとも例外がスローされたら問答無用でデバッガで止めるのかを設定できる。デフォルト設定は「ハンドリングされていない場合はデバッガで止め、ハンドリングしている場合は処理続行」だ。
ThreadAbortException をハンドリングする事はまずないので、HTTP Redirect すればデフォルトでデバッガで止めて欲しいところだが、実際は、ASP.NET フレームワークが ThreadAbortException をハンドリングしているために処理は続行される。従って「例外がスローされたらデバッガで止める」という設定をしておけば、HTTP Redirect 要求時にデバッガで止める事ができ、HTTP Redirect を行っているコードの場所がわかるという寸法だ。