2013-11-21 42 views
1

我正在致力於ASP.Net項目,我們有一個centralized redirection method。但有些時候,它拋出一個異常:System.Threading.ThreadAbortException在泛型重定向

System.Threading.ThreadAbortException

的主要問題是,往往是執行代碼不調用SBA.Redirect("AnotherPage.aspx")之後停止和下面的代碼仍在執行。

我的泛型函數:

public static class SBA 
{ 
     public static void Redirect(string Url) 
     { 
       try 
       { 
        HttpContext.Current.Response.Redirect(Url, false); 
        HttpContext.Current.ApplicationInstance.CompleteRequest();     
       } 
       catch (Exception ex) 
       { 
        if (ex.GetType() != typeof(System.Threading.ThreadAbortException)) 
        { 
         throw; 
        } 
       } 
     } 
} 

回答

0

我使用下面的代碼保護了redirection。它正在工作。

public static class SBA 
{ 

    public static void Redirect(string Url) 
    { 
     try 
     { 
      //redirect only when 'IsRequestBeingRedirected' is false 
      if (!HttpContext.Current.Response.IsRequestBeingRedirected) 
      { 
       Uri uri = null; 
       bool isUriValid = Uri.TryCreate(Url, UriKind.RelativeOrAbsolute, out uri); 

       if (!isUriValid) 
       { 
        throw new SecurityException("Invalid uri " + Url); 
       } 

       //Below check is not required but checked 
       //to make obsolate security check 
       if (uri.OriginalString == null) 
       { 
        throw new SecurityException("Invalid uri " + Url); 
       } 

       // check if host is from configured trusted host list 
       if (uri.IsAbsoluteUri) 
       { 
        var tempAppSetting = ConfigBLL.GetAppSetting(AppSettingSectionType.OtherSetting).Other; 
        if (!tempAppSetting.RedirectTrustedUrls.Contains(uri.Host)) 
        { 
         throw new SecurityException("Untrusted url redirection detected. Can not redirect."); 
        } 
       } 

       var tempUrl = uri.OriginalString; 

       //Few more logical check 

       HttpContext.Current.Response.Redirect(tempUrl, true); 
      } 
      HttpContext.Current.ApplicationInstance.CompleteRequest(); 
     } 
     catch (Exception ex) 
     { 
      if (ex.GetType() != typeof(System.Threading.ThreadAbortException)) 
      { 
       throw; 
      } 
     } 
    } 
} 
0

Redirect爲了從正在運行停止任何下面的代碼引起了ThreadAbortException明確。您正在處理ThreadAbortException

因此下面的代碼正在運行。

如果您不希望運行以下代碼,請不要處理ThreadAbortException

0

簡單地進行下面的調用進行重定向:

HttpContext.Current.Response.Redirect(Url); 

有兩個問題與您的代碼:

  • ,你決定結束您使用的Redirect超載通過爲參數endResponse提供false來響應。因此執行重定向之後的代碼。

  • 您試圖抓住ThreadAbortException。如上所述使用正常重定向時,會拋出此異常。這不是一個錯誤情況,而只是ASP.NET確保正確終止當前請求的一種方式。你可以捕獲異常,但是它會在catch塊的末尾被重新拋出,所以你的catch塊不會做任何有用的事情。

因爲重定向你應該知道在註釋中解釋如下當異常被拋出:

void HandleRequest() { 
    try { 
    Response.Redirect(" ... url ... "); 
    } 
    catch (Exception) { 
    // Code here will execute after the redirect. 
    } 
} 

爲了避免問題的最好的事情就是趕在catch更具體的異常類型處理程序或至少不會干涉處理程序中干擾重定向的任何內容(如寫入響應流)。

+0

你的建議@馬丁實際上是Response.Redirect方法的簡稱。他們都是相同.. :( – Moumit

+0

@MoumitMondal:我不知道我理解你的意見,但你供應'FALSE'爲'endResponse'參數。使用單個參數的重載將調用您正在使用的重載與'true'作爲'endReponse'參數,以確保響應以拋出異常結束。 –