asp.net中的图像URL验证

时间:2015-05-13 11:07:12

标签: asp.net

我有图片网址,我需要检查网址是否响应。 例如:下面我写了三个图片网址,前两个网址无效,只有第三个网址有效。但第二个和第四个网址响应为有效图片 但是没有图像。

http://media.expedia.com/hotels/1000000/90000/84900/84853/84853_744_b.jpg

http://www.iceportal.com/brochures/media/show.aspx?brochureid=ICE19044&did=3073&mtype=3073&type=pic&lang=en&publicid=4175749&resizing=X

http://images.trvl-media.com/hotels/1000000/30000/20400/20313/20313_166_b.jpg

http://www.iceportal.com/brochures/ice/ErrorPages/404.htm?aspxerrorpath=/brochures/media/show_A.aspx

这是我的代码:

public static bool CheckUrlExists(string url)
{
      try
      {
        Uri u = new Uri(url);
        WebRequest w = WebRequest.Create(u);
        w.Method = WebRequestMethods.Http.Head;
        using (StreamReader s = new StreamReader(w.GetResponse().GetResponseStream()))
         {                  
             return (s.ReadToEnd().Length >= 0);
         }
      }
      catch
      {
           return false;
      }
  }

使用此代码,我只验证那些显示404错误的网址,但不会显示那些显示“抱歉”,“请求的小册子暂时未发布”以及任何其他类型消息的网址。

2 个答案:

答案 0 :(得分:1)

您需要更复杂的逻辑来验证URL是否指向图像。如果服务器中缺少资源或者资源不可用,您可能会收到类似臭名昭着的WebException的HTTP错误,这会触发Content-Type。然而,这只是故事的一部分。

您的第二个URL返回HTTP 200,确认资源在那里,实际上资源丢失了。你真正得到的是一个HTML文档,解释了资源不可用。这是不好的做法,但并非没有例子。

至少,您应该检查您测试的资源的MIME类型(image/*标题,请参阅WebResponse.ContentType)。内容类型application/octet-stream表示图像类型资源。未能检测到已知的MIME类型(例如,如果您收到GET),您实际上可以通过HTTP Collector获取资源并对下载的内容运行图像类型检测。

答案 1 :(得分:0)

我建议使用HttpWebRequest和HttpWebResponse来实现这一点,它们是WebRequest和WebResponse的子类,因此对于您尝试实现的内容更加精细。以下代码适用于提供的示例URI

public static bool CheckUrlExists(string url)
    {
        try
        {
            Uri u = new Uri(url);
            HttpWebRequest w = (HttpWebRequest)WebRequest.Create(u);
            w.AllowAutoRedirect = false;
            w.Method = WebRequestMethods.Http.Head;

            HttpWebResponse response = (HttpWebResponse)w.GetResponse();

            return response.StatusCode == HttpStatusCode.OK; //Check http status code
        }
        catch(WebException ex)
        {
            return false;
        }
    }

这里重要的是我正在检查HttpStatus代码。你抓住的东西已经赶上了404,但问题URI最终会导致200(OK)。通过将AllowAutoRedirect设置为false,HttpWebRequest实例返回302(重定向)状态代码,而不是跟随重定向到"抱歉,请求的小册子暂时未发布。"返回200的页面(OK)。这应该符合你的目的。

另外:捕获WebException将允许您检查状态代码(400 +,500 +等)。

请注意,您可能会被重定向到您要求提供的图片的新位置。考虑到这一点你可能想要使用PeterK的mime类型检查。