2010-08-22 152 views
1

一句話要說。這是有史以來最好的.NET社區。保持 !重定向ASP.NET頁面

最近我有一個問題,我設法得到它的兩個解決方案,我想知道應該選擇哪一個。

這裏的問題:

當用戶請求我的網站(WWW .COM),我要去他重定向到,因爲它是一個多語種的網站(WWW .COM/EN)。

我正在使用.NET路由。

在default.aspx頁面的Page_Load中,我檢查Routing Collection中的語言是否可用,我不重定向。如果它不可用,我將重定向到(www.___.com/en)。這裏是代碼:

if (Page.RouteData.Values.Count == 0) 
    { 
     if (SessionManager.IsUserAuthenticated) 
     { 
      //Redirect To User HomePage for his Main Language 
      Page.Response.Redirect(UserManager.GetUserMainPageWhenLoggedIn(SessionManager.LoggedUser.LanguageID,true));         
     } 
     else 
     { 
      Page.Response.Redirect(String.Format("~/{0}", Cultures.en.ToString()), true); 
      Helpers.SetCulture(Cultures.en.ToString()); 
     } 

    } 

我正在使用Response.Redirect來做到這一點。現在,如果我設定結束的響應方法的參數,它會拋出一個異常,所以我可以處理它throught

try 
    { 
     this.InitializeLayout(); 
    } 
    catch (ThreadAbortException ex) 
    { 

    } 
    catch (Exception ex) 
    { 
     ExceptionManager.LogException(ex); 
    } 

如果我不停止響應,網頁會執行整個生命週期,重定向,然後再次執行它會導致頁面的雙重執行。

我的主要目標不是執行該頁面2次以最小化處理(如果該網站受到大流量攻擊)。如果我結束響應,將會拋出一個ThreadAbortExeption,我認爲這對網站並不好(我可以捕獲它並且不記錄它)。

你認爲什麼人?

回答

1

如您所說,您可以通過將false傳遞給endResponse參數來避免拋出異常。如果你想避免執行頁面,你也可以調用HttpContext.Current.ApplicationInstance.CompleteRequest();應該跳過頁面上其餘的代碼。

但是,請注意,回發和呈現方法仍將執行。如果你想避免這種情況,你必須明確包含代碼來忽略它們。如何通過重寫RaisePostBackEvent渲染方法來做這方面的一個很好的例子是在這裏: - >http://www.c6software.com/articles/ThreadAbortException.aspx

0

可以使用的Application_BeginRequest事件處理程序的Global.asax文件或HttpHandler的到做你的重定向。在這兩種情況下,您都將避免進行兩個呼叫。

我還建議您使用server.Transfer而不是response.redirect。