2008-10-10 2 views
17

Я пишу диагностическую страницу для SiteScope, и одна область, которую нам нужно протестировать, - это подключение к файлу/медиа-ресурсам с веб-сервера. Один из способов, которым я могу это сделать, - загрузить изображение через код позади и проверить, является ли сообщение о статусе IIS 200.Проверьте, существует ли изображение на C#

Так что в основном я должен быть в состоянии перейти на сайт в такую ​​папку:/media/1/image.jpg и посмотреть, вернет ли он 200 ... если не исключение.

Я изо всех сил пытаюсь понять, как написать этот код.

Любая помощь очень ценится.

Thanks

+0

Что делать, если я хочу протестировать страницу с URL-адресом, например `http: // localhost/homepage`, и посмотреть, нет ли на этой странице недостающего изображения? Моя первоначальная идея состоит в том, чтобы прочитать страницу с помощью `HttpWebRequest`, получить ответ, а затем изучить содержимое, для каждого элемента , порождать другой запрос. Любая другая идея? – 2014-08-15 04:03:25

ответ

42

Просто используйте ГОЛОВКУ. Не нужно загружать все изображение, если оно вам не нужно. Вот какой шаблонный код.

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url"); 
request.Method = "HEAD"; 

bool exists; 
try 
{ 
    request.GetResponse(); 
    exists = true; 
} 
catch 
{ 
    exists = false; 
} 
+0

это сработало отлично, спасибо. – RedWolves 2008-10-10 18:24:47

+0

Может ли этот метод применяться к папкам, если они существуют или нет? – 2009-12-22 14:03:59

+2

@JL, какие папки? файловая система ?? – Kiquenet 2010-08-31 21:44:08

-1

Я смотрел в HttpWebRequest вместо этого - я думаю, что предыдущий ответ будет фактически загружать данные, в то время как вы должны быть в состоянии получить ответ без данных HttpWebRequest.

http://msdn.microsoft.com/en-us/library/456dfw4f.aspx до этапа № 4 должен сделать трюк. Есть другие поля на HttpWebResponse для получения численного кода если потребности ...

НТН Джек

5

Я использовал что-то подобное раньше, но, вероятно, лучший способ:

try 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://somewhere/picture.jpg"); 
    request.Credentials = System.Net.CredentialCache.DefaultCredentials; 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    myImg.ImageUrl = "http://somewhere/picture.jpg"; 
} 
catch (Exception ex) 
{ 
    // image doesn't exist, set to default picture 
    myImg.ImageUrl = "http://somewhere/default.jpg"; 
} 
14

Возможно, вы захотите также проверить, что у вас есть код состояния OK (например, HTTP 200) и что тип mime из объекта ответа соответствует ожидаемому. Вы можете расширить, что вдоль линий,

public bool doesImageExistRemotely(string uriToImage, string mimeType) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToImage); 
    request.Method = "HEAD"; 

    try 
    { 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     if (response.StatusCode == HttpStatusCode.OK && response.ContentType == mimeType) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch 
    { 
     return false; 
    } 
} 
4

Вы должны распоряжаться объектом HttpWebResponse, в противном случае вы будете иметь проблемы, как я был ...

public bool DoesImageExistRemotely(string uriToImage) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToImage); 

      request.Method = "HEAD"; 

      try 
      { 
       using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
       { 

        if (response.StatusCode == HttpStatusCode.OK) 
        { 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
      } 
      catch (WebException) { return false; } 
      catch 
      { 
       return false; 
      } 
    } 
1

Если вы получаете исключение во время запроса, как «удаленный сервер возвратил ошибку: (401) Несанкционированное.»,

Эту проблему можно решить, добавив следующую строку

request.Credentials = new NetworkCredential(username, password); 

Вопрос и ответ добавлены к этим вопросам от check if image exists on intranet.

1

Если url существует как http: \ server.myImageSite.com, то ответ также неверен , только если imageSize> 0 является истинным.

public static void GetPictureSize(string url, ref float width, ref float height, ref string err) 
    { 
    System.Net.HttpWebRequest wreq; 
    System.Net.HttpWebResponse wresp; 
    System.IO.Stream mystream; 
    System.Drawing.Bitmap bmp; 

    bmp = null; 
    mystream = null; 
    wresp = null; 
    try 
    { 
     wreq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url); 
     wreq.AllowWriteStreamBuffering = true; 

     wresp = (HttpWebResponse)wreq.GetResponse(); 

     if ((mystream = wresp.GetResponseStream()) != null) 
      bmp = new System.Drawing.Bitmap(mystream); 
    } 
    catch (Exception er) 
    { 
     err = er.Message; 
     return; 
    } 
    finally 
    { 
     if (mystream != null) 
      mystream.Close(); 

     if (wresp != null) 
      wresp.Close(); 
    } 
    width = bmp.Width; 
    height = bmp.Height; 
} 

public static bool ImageUrlExists(string url) 
{ 

    float width = 0; 
    float height = 0; 
    string err = null; 
    GetPictureSize(url, ref width, ref height, ref err); 
    return width > 0; 
} 
Смежные вопросы