2008-10-10 21 views
17

Estoy escribiendo una página de diagnóstico para SiteScope y un área que debemos probar es si la conexión a los activos de archivos/medios es accesible desde el servidor web. Una forma en que creo que puedo hacer esto es cargar la imagen a través del código y probar para ver si el mensaje de estado de IIS es 200.Probar para ver si existe una imagen en C#

Así que básicamente debería poder navegar dentro del sitio a una carpeta como esta:/media/1/image.jpg y ver si devuelve 200 ... si no arrojar una excepción.

Estoy luchando por encontrar la manera de escribir este código.

Cualquier ayuda es muy apreciada.

Gracias

+0

¿Qué pasa si quiero probar una página con URL como 'http: // localhost/homepage' y ver si falta alguna imagen en esta página? Mi idea inicial es leer la página usando 'HttpWebRequest', obtener la Respuesta y luego buscar en el contenido, para cada elemento , engendrar otra Solicitud. Alguna idea diferente? –

Respuesta

42

Solo utilice HEAD. No es necesario descargar toda la imagen si no la necesita. Aquí hay un código repetitivo.

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

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

esto funcionó perfectamente, gracias. – RedWolves

+0

¿Se puede aplicar este método a las carpetas si existen o no? –

+2

@JL, ¿qué carpetas? sistema de archivos? – Kiquenet

-1

me vería en un lugar HttpWebRequest - Creo que la respuesta anterior en realidad va a descargar los datos, mientras que usted debería ser capaz de obtener la respuesta sin datos de HttpWebRequest.

http://msdn.microsoft.com/en-us/library/456dfw4f.aspx hasta el paso # 4 debería hacer el truco. Existen otros campos en HttpWebResponse para obtener el código numérico si es necesario ...

hth Jack

+0

Lo único que se descargará es el encabezado de respuesta, que es por definición la "respuesta" –

5

he usado algo como esto antes, pero es probable que haya una mejor manera:

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

Es posible que también desee verificar que haya obtenido un código de estado correcto (es decir, HTTP 200) y que el tipo de mímica del objeto de respuesta coincida con lo que está esperando. Se podría extender ese lo largo de las líneas de,

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; 
    } 
} 
+1

Me gustaría agregar que si agrega una instrucción de uso en la solicitud HttpWebResponse ... se asegurará de que su aplicación no se cuelgue después de tres solicitudes consecutivas. Este escenario puede aparecer cuando se utiliza un BackgroundWorker. usando (Respuesta de HttpWebResponse = (HttpWebResponse) request.GetResponse()) {// la lógica viene aquí} – asuciu

+0

También si obtiene cualquier ProtocolError (El servidor remoto devolvió un error: (500) Internal Server Error.) Change: request.Method = "GET"; – asuciu

+1

¿Cuál es el tipo de mime que se especificará para la imagen? – Shimmy

4

usted tiene que disponer del objeto HttpWebResponse, de lo contrario tendrá problemas ya que he tenido ...

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; 
      } 
    } 
+0

¿Qué problemas tienes? –

+0

¿Qué problemas, señor? – Kiquenet

+0

@Kiquenet Creo que la memoria no tiene problemas – VMAtm

1

si usted está recibiendo una excepción durante la solicitud como "el servidor remoto devolvió un error: (401) no autorizado.",

Esto se puede resolver mediante la adición de la siguiente línea

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

La pregunta y la respuesta añadidas a estas preguntas de check if image exists on intranet.

1

Si existe url como http: \ server.myImageSite.com, la respuesta es falsa también solo si imageSize> 0 es verdadero.

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; 
} 
Cuestiones relacionadas