2011-01-21 66 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'的回退。) –