2011-01-21 67 views
0
public void BuildImg() 
{ 
    // The two different images as strings. 
    string url1 = "http://remoteimage.com/image.jpg"; 
    string url2 = "http://remoteimage.com/image2.jpg"; 

    try 
    { 
     // Check to see if url1 exists or not 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url1); 
     request.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     myImg.Visible = true; 
     myImg.ImageUrl = url1; 
    } 
    catch (Exception ex) 
    { 
     // Check to see if url2exists or not 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url2); 
     request.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     HttpWebResponse response; 
     try 
     { 
      response = request.GetResponse() as HttpWebResponse; 
     } 
     catch (WebException exc) 
     { 
      response = exc.Response as HttpWebResponse; 
     } 
     // Set myImg to show if url2 exists 
     myImg.Visible = true; 
     myImg.ImageUrl = url2; 

     // If response returns 404, then hide myImg 
     if (response.StatusCode == HttpStatusCode.NotFound) 
     { 
      myImg.Visible = false; 
     } 

    } 
+1

這裏有一個問題嗎? – Bryan

+0

當你確定使用結果類型(並進行空檢查)時,使用'case',而不是運算符'as',即'(HttpWebResponse)request.GetResponse()' – abatishchev

+1

這是問題還是答案? – Oded

回答

1
var arr = new[] 
{ 
    "http://example.com/image.jpg", 
    "http://example.com/image2.jpg" 
    ... 
}; 

myImg.ImageUrl = arr.FirstOrDefault(i => CheckExistence(i)); 

static bool CheckUrlExistence(string url) 
{ 
    try 
    { 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     request.Credentials = CredentialCache.DefaultCredentials; 
     request.Method = "HEAD"; 
     var response = (HttpWebResponse)request.GetResponse(); 
     return response.StatusCode == HttpStatusCode.OK; 
    } 
    catch (Exception ex) 
    { 
     var code = ((HttpWebResponse)((WebException)ex).Response).StatusCode; // NotFound, etc 
     return false; 
    } 
+0

1.一個不存在的頁面不會導致一個異常,而是一個帶有404錯誤代碼的響應。 2.即使它拋出,捕捉每一個異常,假設它們都意味着該頁面不存在是非常糟糕的形式。 –

+0

@Paul:同意。我剛剛重寫了OP的代碼。看我的編輯 - 你有什麼想法? – abatishchev

+3

我能想到的測試Web資源存在的最佳方法是創建HEAD請求。這樣,人們就可以確認資源的存在,而無需付費來下載它。您可以通過將「WebRequest.Method」設置爲「HEAD」來發出HEAD請求 - 404的響應表明它不存在。 (一個人應該仔細處理Web服務器不支持'HEAD'方法的情況 - 也許是'GET'的回退。) –