Prova a vedere se esiste un’immagine in C #

Sto scrivendo una pagina di diagnostica per SiteScope e un’area che dobbiamo testare è se la connessione al file / risorse multimediali è accessibile dal server web. Un modo in cui penso di poterlo fare è caricare l’immagine via codice e testare per vedere se il messaggio di stato di IIS è 200.

Quindi in pratica dovrei essere in grado di navigare all’interno del sito in una cartella come questa: /media/1/image.jpg e vedere se restituisce 200 … se non genera un’eccezione.

Sto lottando per capire come scrivere questo codice.

Qualsiasi aiuto è molto apprezzato.

Grazie

Basta usare HEAD. Non è necessario scaricare l’intera immagine se non ne hai bisogno. Ecco alcuni codici per il codice.

 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url"); request.Method = "HEAD"; bool exists; try { request.GetResponse(); exists = true; } catch { exists = false; } 

Si potrebbe anche voler controllare di avere un codice di stato OK (cioè HTTP 200) e che il tipo di mime dall’object risposta corrisponda a ciò che si aspetta. Potresti estenderlo seguendo le linee di

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

Ho usato qualcosa di simile prima, ma probabilmente c’è un modo migliore:

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

Devi disporre dell’object HTTPWebResponse, altrimenti avrai problemi come ho avuto …

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

Se durante la richiesta ricevi un’eccezione come “Il server remoto ha restituito un errore: (401) Non autorizzato.”,

Questo può essere risolto aggiungendo la seguente riga

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

Domande e risposte aggiunte a queste domande dal controllo se l’immagine esiste su intranet .

Se url esiste come http: \ server.myImageSite.com, la risposta è falsa anche solo se imageSize> 0 è true.

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

Cercherei invece una HttpWebRequest – penso che la risposta precedente in realtà scaricherà i dati, mentre dovresti essere in grado di ottenere la risposta senza i dati da HttpWebRequest.

http://msdn.microsoft.com/en-us/library/456dfw4f.aspx fino a quando il passaggio n. 4 dovrebbe fare il trucco. Ci sono altri campi su HttpWebResponse per ottenere il codice numerico se necessario …

hth Jack