Проверьте, существует ли изображение в С#

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

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

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

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

Спасибо

Ответы

Ответ 1

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

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

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

Ответ 2

Вы также можете проверить, что у вас есть код состояния 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;
    }
}

Ответ 3

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

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";
}

Ответ 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;
            }
    }

Ответ 5

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

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

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

Вопрос и ответ добавлены к этим вопросам из проверьте, существует ли изображение в интрасети.

Ответ 6

Если 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;
}

Ответ 7

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

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

НТН Джек