2010-11-19 5 views
0

熟考するいくつかのシナリオ。 Example1とExample2を実装したレガシーコードがあります。 MSDN recommendationを実装しようとすると、レガシーコードが失敗します。ここレガシーコードの実装を改善するには、Response.Redirect?

レガシーコードの例である:

例1:

void Page_Load() { 
    .... some code 
    if(condition) { 
    /// some condition 
    } else { 
    RedirectPage(url); 
    } 

    // another code block 
    // some other conditions. 
} 

例2:

a. File1.ascx 
void Page_Load() { 
    try { 
    .. some code 
    base.CheckPreference(); 
    RedirectPage(defaultPage); 
    } 
    catch(Exception ex) { 
    ExceptionHandling.GetErrorMessage(ex); 
    } 
} 
b. BaseClass.cs // this is the base class 
void CheckPreference() { 
    try { 
    if(condition) { 
     RedirectPage(url1); 
    } else if(condition2) { 
     RedirectPage(url2); 
    } else { 
     // update session 
    } 

    } 
    catch(Exception ex) { 
    ExceptionHandling.GetErrorMessage(ex); 
    throw; 
    } 
} 

void RedirectPage(string url) { 
    Response.Redirect(url); 
}

1つの可能な方法は、クラス、例えばendExecutionにブールフィールドを追加することですRedirectPageが呼び出されるたびにフィールドをtrueに設定します。私たちは、RedirectPageコードを更新する必要が

は、以下のコードを参照してください。

 
// Updated code - MSDN recommendation. 
void RedirectPage(url) { 
    Response.Redirect(url, false); 
    this.Context.ApplicationInstance.CompleteRequest(); 
    endExecution = true; 
} 

レガシーコードの実装を改善するために他のいくつかのより良い方法を提案してください。

+0

遭遇している問題は何ですか?リダイレクトメソッドに 'false'を渡し、' CompleteRequest() 'を呼び出すことで、リクエストを終了する必要があります。 –

+0

あなたのレガシーコードはどうなりますか?エラーは何ですか –

+0

レガシーコードには、RedirectPageがThreadAbortExceptionをスローするため、RedirectPageが呼び出されなかった後のコードブロックがあります。 しかし、MSDNが示唆しているものを実装すれば、RedirectPageの後のコードは実行されます。これは実行したくありません。これはレガシーコードなので、RedirectPageの後には多くの場所でコードがあります。サービスコールの呼び出し、セッションの更新など。 私は代替アプローチを探しています。 –

答えて

3

おそらく、リダイレクトを発行する人々のための最も直感的なことは、われわれがRespond.Redirectと呼んでいる方法から私たちがすでに戻ってきたということです(当時のあなたの言語/完了したメソッドが呼び出されています

最後の行は、同じリクエストに対する応答をコミットしようとするのを避けるためにリクエストの処理を停止しなければならないということです。

ASP.NET MVCはActionResponseでこれを改善しました。その結果、メソッドから戻り、次のようなコードでリクエスト処理の残りを終了します。

return Redirect(url); 

リダイレクトを実行した直後にイベントから復帰する習慣を身に付ける必要があります。その習慣からの逸脱は、コードに文書化する必要があります。これにより、アプリケーションが期待通りの動作をするのに役立ちます。

あなたが取ったアプローチは完全に合理的です。

+0

こんにちは、伝統的なアプローチは完全に合理的ですか? –

+0

リダイレクトを実行した直後にメソッドから戻ってくるのは完全に合理的です。あなたは、あなたが想定していないコードを誤って実行しないように注意する必要があります。意図が完全に明確でコードが保守可能である限り、誰かが新しい「ベストプラクティス」を夢見て変更しないでください。それが壊れているか、または一緒に置かれている方法が明確でないために何かを変更してください。 –