2012-12-09 44 views
1

我想重定向到一個url,但是如果它失敗,會被通知。什麼是嘗試Response.Redirect的正確方法?

據我所知,一個簡單的try-catch塊不會在這裏工作,因爲重定向總是引發異常。儘管我可以檢查該異常(ThreadAbortException),但是這是最好的方法嗎?

編輯:我想重定向到一個特定的網址,如果它不存在 - 到另一個網址。

+1

如果失敗並且顯示消息,則不會重定向。你的意思是如果重定向失敗?你不知道目標網址?什麼 ? – Aristos

+0

@Aristos這是我的問題 - 我如何通知它失敗了。 - 我的意思是 - 如何通知計劃。 – ispiro

+1

如果您需要知道如此重要,那麼您需要在目標網址上添加信號。如果你只是想知道目標網址是否存在,那麼你簡單地檢查出來之前,重定向與來自代碼背後的URL調用。 – Aristos

回答

4

啓發因爲重定向是客戶端操作(服務器簡單用代碼302發送響應並將報頭location設置爲重定向目標)如果重定向在客戶端上成功(或者即使它將被遵循),您也不能期望服務器端Request.Redirect調用給你任何指示。

您選擇:

  • 只是住在一起
  • 如果重定向是本地的,你至少可以驗證,如果本地路徑存在(或者如果ysing MVC - 如果給定參數的路由定義)。
  • 如果重定向是遠程的,您可以嘗試先在服務器上發出請求,然後查看響應是否合理(如「不是404」)。

不幸的是所有的服務器端選項,以查看是否目標頁面存在有嚴重的缺陷:

  • 檢查鏈接潛在的慢操作
  • 你會不會ALBE通過認證信息/ cookes到頁在遠程位置
  • 一些服務器響應200的「頁面確實不存在,看別的地方」。
+0

謝謝。請糾正我,如果我錯了 - 檢查文件是否存在可能會遇到權限問題,即使在本地上下文(這是一個虛擬主機服務),因爲我_do_需要知道 - 我留下了發送選項請求並查看它是否失敗。 (我可以通過檢查我的網站主機如何管理它) – ispiro

+0

@ispiro,是的。請注意,檢查是否存在文件時,您也可能遇到反向問題 - 本地代碼可以訪問比HTTP更多的文件。 –

+0

謝謝。 – ispiro

2

我不認爲這個代碼將贏得獎金,但是這至少可以防止ThreadAbortException ...

KB article

bool redirectOK = false; 
try 
{ 
    Repsonse.Redirect(url, false); 
    redirectOK = true; 
} 
catch(Exception exp) 
{ 
    // log/handle/whatever 
} 
if (redirectOK) 
{ 
// do what even you want for a serverside succeeded redirect 
} 
else 
{ 
    // do what ever you want for a failure to redirect 
} 
+0

看起來不錯。檢查它。 – ispiro

+0

+1。請注意,不拋出異常會讓頁面上的其他代碼完成執行 - 確保在重定向後不執行任何操作(即,我相信你甚至可以在Respose.Redirect(url,false)''後面調用'Resposnse.Clear()'來移除重定向。 –

+0

我剛剛嘗試用一個「false」重定向到一個不存在的url,(在本地主機上運行Visual Web Developer)並且瀏覽器顯示我「找不到資源」,即使我在重定向後有一個空的catch 'try'。 – ispiro

0

那麼,這將檢查404錯誤,然後直接到頁面,如果沒有錯誤。

if URLExists(theURL){ 
Response.Redirect(theUrl); 
} 
else{ 
//redirect somewhere else 
} 


public static bool UrlExists(string url) 
     { 
      try 
      { 
       if (url == "") 
       { 
        return false; 
       } 
       else 
       { 
        new System.Net.WebClient().DownloadData(url); 
        return true; 
       } 
      } 
      catch (System.Net.WebException e) 
      { 
       try 
       { 
        if (((System.Net.HttpWebResponse)e.Response).StatusCode == System.Net.HttpStatusCode.NotFound) 
         return false; 
        else 
         throw; 
       } 
       catch 
       { 
        return false; 
       } 
      } 
     } 
相關問題