Server.Transfer, Response.Redirectした際にThreadAbortException例外が発生する時の対処法(ASP.NET)

ASP.NETで、Response.Redirect(“URL”)とすると、以下のようにThreadAbortExceptionが発生してしまいます。

QvAuth Error: 0 : ALL:Error caused.
QvAuth Error: 0 : System.Threading.ThreadAbortException: スレッドを中止しようとしました。
   場所 System.Threading.Thread.AbortInternal()
   場所 System.Threading.Thread.Abort(Object stateInfo)
   場所 System.Web.HttpResponse.End()
   場所 QlikViewExtension.AuthenticationModule.<Init>b__1(Object s, EventArgs e)

これが良くわからないのは、try~catchで囲んだ中で画面遷移(Server.Transfer, Response.Redirect)を行うと例外が発生しないということです。

そのため、対処法としては、ページ遷移を行う部分を一番最後にして、try~catchから外に出すという方法が考えられます。

ただ、これだと遷移時に例外が起こったときに何もできない場合がありますので、ThreadAbortException例外のみを補足するcatchの中で、何らかの後処理を行うと良いでしょう。

(ページ遷移で何か起こった場合は、ランタイム例外に近いので、どうせ何もできないという考え方もありますが。。。)

なお、この現象についてはマイクロソフトのサポートページにも対処法がのっています。

もうひとつの対処方は、このページにならったものです。

Response.Redirectの場合は、

Response.Redirect(“URL”,false);

のように、メソッドの第2引数にfalseを渡すことで例外を抑制できます。

これは、例外の原因が内部でResponse.Endが呼び出されることによるものだからだそうです。

メソッドは、Response.Redirect(urlの文字列、boolendResponse)の形をしており、第2引数にfalseを渡すことで内部でResponse.Endの呼び出しが行われるため、例外の発生を抑制することができます。

Server.Transferの場合は、このメソッドの代わりに、

Server.Execute(“ページ”)

を使用すれば、例外の発生が無くなります。