Saber si una página aspx que devuelve una imagen, la devuelve o no???
Diariamente colaboro respondiendo dudas a la gente que se pasa por los Foros de MSDN y por las NewsGroup de ASP.NET y el otro día salío un post en el cual querían saber cuando una página aspx devolvía una imagen correcta o directamente no la devolvía porque no existía. Era algo como muestra el siguiente código:
1: //Página que devuelve la imagen
2: public void descarga(string filepath, string filename)
3: { 4: Response.Clear();
5: Response.ContentType = "application/gif";
6: Response.Flush();
7: Response.WriteFile(filepath);
8: Response.End();
9: }
10:
11: //Pagina que la recoge y la muestra en un ImageButton
12: public void cargarImagenes(String nombre)
13: { 14: String url = @"http://servidor/website3/Imagen.aspx?nombre=" +nombre;
15: IBPeriodico.ImageUrl = url;
16: }
Como se puede observar en el método cargarImagenes, no se puede saber si te devuelve una imagen o no, aunque si puedes poner una imagen de no disponible en el caso que la página aspx no devuelva una imagen, pero el caso es que necesitaban saber si retornaba una imagen o no. Pues me puse manos a la obra y se me ocurrio lo siguiente:
1: string url =
2: "http:/servidor/aplicacionDevuelveImagen.aspx?nombreImagen=loqsea";
3: HttpWebRequest request =
4: (HttpWebRequest)WebRequest.Create(url);
5: HttpWebResponse response;
6: response = (HttpWebResponse)request.GetResponse();
7: System.IO.Stream receiveStream = response.GetResponseStream();
8: try
9: { 10: Image img = Image.FromStream(receiveStream);
11: }
12: catch(Exception ex)
13: { 14: //La imagen devuelta no es válida y por
15: //tanto podemos tomar una decisión sobre
16: //que hacer
17: }
La idea es que como el ContentType de la página aspx devuelve una imagen y con un objeto HttpWebResponse disponemos de un Stream y la clase Image tiene un método para crear una imagen a partir de un Stream, pues se me ocurrio que si la página no devuelve ninguna imagen al crear la imagen fallaría y así es.
No se si es una manera óptima o correcta de hacerlo pero la verdad es que funciona y no me parecía mal solución del todo.
Un saludo.