Prueba para ver si existe una imagen en C #

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 mediante el código subyacente y probar para ver si el mensaje de estado de IIS es 200.

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 descubrir cómo escribir este código.

Cualquier ayuda es muy apreciada.

Gracias

Solo usa 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; } 

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. Puedes extender eso a 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; } } 

He usado algo así antes, pero probablemente haya una mejor manera:

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

Debe deshacerse del objeto HTTPWebResponse; de ​​lo contrario, tendrá problemas como yo 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; } } 

Si obtiene una excepción durante la solicitud como “El servidor remoto devolvió un error: (401) No autorizado.”,

Esto puede resolverse agregando la siguiente línea

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

Preguntas y respuestas agregadas a estas preguntas de verificar si la imagen existe en la intranet .

Si url existe como http: \ server.myImageSite.com, la respuesta también es falsa 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; } 

Me gustaría buscar en una HttpWebRequest en su lugar – Creo que la respuesta anterior en realidad descargará datos, mientras que debería poder 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. Hay otros campos en HttpWebResponse para obtener el código numérico si es necesario …

hth Jack