4

コードビハインドでの呼び出しreturn後にステートメントを保持する必要があるかどうか疑問に思っていましたか? Response.RedirectPermanent違うようですが、他の人に確認したかったのです。

Response.RedirectPermanent(vpd.VirtualPath);
return;

機能またはパフォーマンスの向上のためにそうする理由はありますか?

4

2 に答える 2

4

回答のオーバーホール:

電話を持ってください!私の以前の回答の詳細は、さらに調査した結果、まったく真実ではありませんでした。実際、MSDN のドキュメントでは次のように指定されています。

ページ ハンドラーでこのメソッドを使用して、あるページの要求を終了し、別のページの新しい要求を開始する場合は、endResponse を false に設定してから、CompleteRequest メソッドを呼び出します。endResponse パラメーターに true を指定すると、このメソッドは元の要求の End メソッドを呼び出し、完了時に ThreadAbortException 例外をスローします。この例外は、Web アプリケーションのパフォーマンスに悪影響を及ぼすため、endResponse パラメーターに false を渡すことをお勧めします。

http://msdn.microsoft.com/en-GB/library/a8wa7sdt.aspx

したがって、実際には、ページの残りの部分は実行されません(理論的には、これが失敗する場合の例については、以下の「更新」を参照してください)。ただし、現在の方法でそれを行うことにはまだ非常に具体的な問題があります。これは、現在のスレッドの処理を終了する比較的高価な方法である をendResponseスローすることによってメカニズムが実装されていることです。ThreadAbortException

代わりに、スレッドを続行させるが、すぐに戻るように指示する必要があります。また、コール スタック内の他のメソッドが本来の処理を行っていることを確認してください。

Response.RedirectPermanent(vpd.VirtualPath, false);
return;

さらに良いことに、呼び出しを条件付きでラップして、望ましくないコードが呼び出されないようにしてから、CompleteRequestメソッドを使用します (現在実行中のコードは終了しませんが、後続のすべてのイベントをバイパスします)。

if (_redirecting)
{
    Response.RedirectPermanent(vpd.VirtualPath, false);
    Context.ApplicationInstance.CompleteRequest();
}
else
{
    /* Code I don't want to execute if I do a redirect */
    DeleteUsersDataForever(_currentUser);
}

このトピックに関する詳細な記事がここにあり、ドキュメント自体でさえ、メソッドに対して不健康な嫌悪感HttpResponse.EndResponse.Redirectを持っているようです。これは、応答終了を許可した場合に呼び出されるものです。

更新:さらに、スレッドが例外を発生させることによって終了することを考えると、try/catch 内でリダイレクトを試行して実行するとどうなるかを検討してください。

try
{
    // Redirect and terminate execution
    Response.Redirect(someUrl, true);
}
catch
{
    // Handle some errors.
}

DeleteUsersDataForever(_currentUser);

によって発生した例外Response.End、 catch ブロックでキャッチされます。したがって、コードの残りの部分は引き続き実行され、誤ってすべての のデータを削除してしまいます (呼び出し元に例外をバブリングするなど_currentUser、ブロックでこれを防ぐために何かをしない限り)。catch

于 2013-04-27T20:45:16.900 に答える