このナレッジベース記事では、ASP.NET Response.End()がスレッドを中止すると説明しています。
Reflectorは次のように表示されます。
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
これは私にはかなり厳しいようです。KB記事に記載されているように、アプリの次のコードはResponse.End()実行されません。これは、驚きの原則に違反します。Application.Exit()WinFormsアプリとほぼ同じです。が原因で発生したスレッドアボート例外Response.End()はキャッチできないため、コードをtry... で囲むfinallyと満足できません。
いつも避けたほうがいいかなぁResponse.End()。
誰がいつResponse.End()、いつResponse.Close()、いつ使用するべきかを提案できますHttpContext.Current.ApplicationInstance.CompleteRequest()か?
ref:Rick Strahlのブログエントリ。
私が受け取った入力に基づくと、私の答えは「はい、Response.End有害です」ですが、いくつかの限られた場合に役立ちます。
Response.End()キャッチできないスローとして使用し、HttpResponse例外的な状況でを即座に終了します。デバッグ中にも役立ちます。 日常的な対応は避けてくださいResponse.End()。Response.Close()クライアントとの接続をすぐに閉じるために使用します。パーこのMSDNのブログの記事、この方法は、通常のHTTPリクエストを処理するためのものではありません。 このメソッドを呼び出す正当な理由がある可能性はほとんどありません。CompleteRequest()通常のリクエストを終了するために使用します。 現在のイベントが完了した後CompleteRequest、ASP.NETパイプラインがEndRequestイベントにジャンプHttpApplicationします。したがって、を呼び出しCompleteRequestて、応答に何かを書き込むと、書き込みはクライアントに送信されます。
編集-2011年4月13日
また、透明度がここにあります:
- MSDNブログに便利なポスト
- ジョン・リードによって便利な分析
Response.RedirectしてServer.Transfer、コールの両方Response.Endとも避けるべきです。
Response.EndThreadAbortException問題なく動いています。