2016-11-24 146 views
1

我必須重定向從WebMethod,我知道我不能。所以我只是試圖返回頁面url作爲字符串,並將在success回調重定向。ThreadAbortException在WebMethod中未正確捕獲

問題是我在重定向之前有大量的代碼,並且寫在一個集中式方法中(只有在重定向之前調用以執行相同操作的方法)。在我的重定向中,我也必須調用該函數。

我只是把我的代碼放在這裏,不用調用集中的函數來更好的理解。

[WebMethod] 
    [ScriptMethod(UseHttpGet = true)] 
    public static string TestException() 
    { 
     try 
     { 
      System.Web.HttpContext.Current.Response.Redirect("Test.aspx"); 
      return "No Exception"; 
     } 
     catch(Exception ex) 
     { 
      return "Exception"; 
     } 

    } 

響應我得到Internal Server Error (505)System.Threading.ThreadAbortException,而不是返回「異常」在catch塊。

這是不是與其他異常,即情況下,如果我喜歡的東西

int i = 0; 
int j = 5/i; 

這也提出了異常,但並沒有給我Internal Server Error (505)更換Response.Redirect,而不是返回「EXCETION」,即從捕撈返回的字符串塊。

我的問題是

  1. 爲什麼它是從其他異常處理System.Threading.ThreadAbortException不同?
  2. 我知道其他的工作,如功能加載和可選參數Centralized函數中使用,並通過檢查額外的參數我可以返回字符串,而不是重定向,但我想知道是否有什麼,我可以使用webmethod內或任何沒有觸及集中功能的其他地方讓它工作?

回答

1

爲什麼它是從其他異常處理System.Threading.ThreadAbortException不同 ?

關於第一個問題,從ThreadAbortException MSDN上:

ThreadAbortException是一個特例可以被捕獲但 會自動再次的結束募集catch catch。當 引發此異常時,運行時會在結束線程之前執行所有最終塊 。因爲線程可以在finally塊中執行無限的計算,或者調用Thread.ResetAbort取消 中止,所以不能保證線程永遠不會結束。如果 要等到中止的線程結束,則可以調用 Thread.Join方法。 Join是一個阻塞調用,直到 線程實際停止執行纔會返回。

我認爲爲了防止這種情況,您需要在catch塊中調用Thread.ResetAbort()

[WebMethod] 
[ScriptMethod(UseHttpGet = true)] 
public static string TestException() 
{ 
    try 
    { 
     System.Web.HttpContext.Current.Response.Redirect("Test.aspx"); 
     return "No Exception"; 
    } 
    catch(ThreadAbortException ex) 
    { 
     Thread.ResetAbort(); 
     return "Exception"; 
    } 

} 

並使用響應。在WEB METHOD重定向不是一個好習慣!當您使用WEB METHOD時,您應遵循SOAP規則。而且您需要知道致電Response.Redirect將致電Response.End

HttpResponse.Redirect Method頁在MSDN:(例如,http://www.contoso.com/default.aspx

絕對URL或 相對URL(例如,Default.aspx的)可以被用於 目標位置指定,但一些瀏覽器可能拒絕一個相對URL。 重定向 調用End完成後,引發ThreadAbortException異常

+0

在使用'Thread.ResetAbort'後在控制檯上給出'Authentication failed'錯誤 – Imad

+0

@Imad相信我,使用'HttpRedirect'並不是一個好的做法。我建議你不要這樣做。 –

+0

早就答應了。想要仍然*嘗試*它。 – Imad