【问题标题】:How to check if remote image exists with C#如何使用 C# 检查远程图像是否存在
【发布时间】:2011-01-21 15:34:09
【问题描述】:
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;
        }

    }

【问题讨论】:

  • 当你确定结果类型(并进行空检查)时,使用case,而不是运算符as,即(HttpWebResponse)request.GetResponse()
  • 这是一个问题还是一个答案?
  • 只放代码是不够的。你必须解释你想要什么,以获得更好的答案..

标签: c#


【解决方案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;
    }

【讨论】:

  • 1.不存在的页面不会导致异常,而是带有 404 错误代码的响应。 2. 即使要抛出,捕获每个异常并假设它们都意味着页面不存在是非常糟糕的形式。
  • @Paul:同意。我只是重写了OP的代码。看看我的编辑 - 你怎么看?
  • 我能想到的测试 Web 资源是否存在的最佳方法是发出 HEAD 请求。这样,人们就可以确认资源的存在而无需支付下载费用。您可以通过将WebRequest.Method 设置为“HEAD”来发出 HEAD 请求 — 404 的响应表明它不存在。 (应该小心处理网络服务器不支持“HEAD”方法的情况——或许可以回退到“GET”。)
  • 正如@Paul Ruane 所说,使用HEAD,这就是重点
猜你喜欢
  • 2012-05-16
  • 2016-07-09
  • 2010-11-24
  • 1970-01-01
  • 2013-04-30
  • 2012-03-01
  • 2010-11-02
  • 2011-11-29
相关资源
最近更新 更多