このKB記事には、ASP.NETResponse.End()
がスレッドを中止すると書かれています。
リフレクターは、次のようになっていることを示しています。
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:RickStrahlのブログエントリ。
私が受け取った入力に基づいて、私の答えは、はい、Response.End
有害ですが、それはいくつかの限られた場合に役立ちます。
Response.End()
キャッチできないスローとして使用してHttpResponse
、例外的な状況ですぐに終了します。デバッグ中にも役立ちます。日常的な応答を完了することは避けてくださいResponse.End()
。Response.Close()
クライアントとの接続をすぐに閉じるために使用します。パーこのMSDNのブログの記事、この方法は、通常のHTTPリクエストを処理するためのものではありません。このメソッドを呼び出す正当な理由がある可能性はほとんどありません。CompleteRequest()
通常のリクエストを終了するために使用します。現在のイベントが完了した後CompleteRequest
、ASP.NETパイプラインがEndRequest
イベントにジャンプHttpApplication
します。したがって、を呼び出してCompleteRequest
から、応答にさらに何かを書き込むと、書き込みはクライアントに送信されます。編集-2011年4月13日
また、透明度がここにあります:
- MSDNブログに便利なポスト
-ジョン・リードによって便利な分析
アプリで例外ロガーを使用していた場合はThreadAbortException
、これらの無害なResponse.End()
呼び出しからのsで水が減ります。これがマイクロソフトの「ノックオフ!」という言い方だと思います。
Response.End()
例外的な状態があり、他のアクションが不可能な場合にのみ使用します。たぶん、この例外をログに記録すると、実際には警告が示される可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加