2010-11-19 19 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); 
}

一種可能的方式是在類例如endExecution添加一個布爾字段,無論何時調用RedirectPage,都將該字段設置爲true。

我們必須更新RedirectPage代碼參見下面的代碼片段:

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

請建議一些其他更好的方法來改善遺留代碼執行。

+0

您遇到的問題是什麼?通過將'false'傳遞給重定向方法,然後調用'CompleteRequest()',這應該結束請求。 – 2010-11-19 18:26:15

+0

您的遺留代碼中會發生什麼?什麼是錯誤 – 2010-11-19 18:29:44

+0

在傳統代碼中存在的代碼塊在RedirectPage不會被調用之後,因爲RedirectPage引發ThreadAbortException。 但是,如果我實現了MSDN建議的內容,那麼RedirectPage之後的代碼將得到執行,我不想執行它。由於這是遺留代碼,在很多地方,RedirectPage之後有很多代碼,例如,撥打服務電話,更新會議等... 所以我正在尋找替代方法。 – 2010-11-19 19:46:35

回答

3

可能對於發佈重定向的人來說,最不直觀的事情是在我們的腦海裏,我們已經從方法中返回了我們所說的Respond.Redirect(或者當前語言/平臺上的任何equivilent)。已經完成的方法是調用方法

底線是你必須停止處理請求,以避免嘗試提交相同請求的響應,這會在我所使用的任何平臺上引發異常

ASP.NET MVC使用ActionResponse改進了這一點,以便您使用類似下面的代碼從方法返回(並終止請求處理的其餘部分):

return Redirect(url); 

底線是,您需要養成在執行重定向後立即從事件返回的習慣。任何偏離該習慣的情況都需要在代碼中記錄爲什麼。這將有助於使應用程序以您期望的方式執行。

你採取的方法是完全合理的。

+0

嗨,你是說傳統方法完全合理嗎? – 2010-11-19 21:32:58

+0

執行重定向後,立即返回該方法是完全合理的。你要小心,不要意外執行你不應該的代碼。只要意圖清楚,代碼可維護,不要改變它,因爲有人想出了一個新的「最佳實踐」。改變一些東西是因爲它被破壞或者放在一起的方式不清楚。 – 2010-11-20 04:09:11