[ASP.NET]Response.Endは骨董品なので使わないこと

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しているのでこの行に処理はこない

参照

docs.microsoft.com

コメントを残す