2019/06/12 11:37
CompleteRequestをRequest.CompleteRequestと書いていたので(そんなものはない)、HttpApplication.CompleteRequestに修正しました。
ASP.NETにおけるResponse.EndはただASPとの互換性のためだけに設けられた骨董品メソッドです。しかもASPのResponse.Endと同じ動作をするものの、動作を模倣しただけのものであるため、望まない動作をする場合があります。
望まない動作とは…
- 必ずThreadAbortExceptionが発生すること
- 性能が悪化すること
ASP.NETにおいてはHttpApplication.CompleteRequestを使うべきです。
とはいえ…
ただ、HttpApplication.CompleteRequestがResponse.Endと全く同じ動作をするのであればEndメソッドがわざわざ残っているわけはなく、下記の動作の違いがあります。
- Response.Endメソッド
コールした時点で全ての処理を無理矢理終わらせる。コール後は何の処理も走りません。 - HttpApplication.CompleteRequest メソッド
EndRequestイベントを発生させます。イベントを発生させるだけなので、それ以降の行も実行されます。
簡単なコードで示します。
下記のコードでflag==falseの場合はResponse.End()が実行され、その結果処理が中断されるのでx++;は実行されません。
if( flag == false){
Response.End();
}
x++; //←Response.End()が実行されるとここの行には処理がこない
しかし、ComplateRequestの場合は、x++;は実行されます。
if( flag == false){
Context.Current.ApplicationInstance.CompleteRequest();
}
x++; //←ComplateRequestを実行してもこの行に処理は来る
ComplateRequestメソッドはその性質上、returnと組み合わせて使うケースが多いのではないかと思います。
if( flag == false){
Context.Current.ApplicationInstance.CompleteRequest();
return;
}
x++; //←Response.ComplateRequestのあとにreturnしているのでこの行に処理はこない