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.

Published 17/1/2007 9:21 por Luis Ruiz Pavón
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2007/01/17/saber-si-una-a-aspx-que-devuelve-imagen-la-devuelve-o-no.aspx

Comentarios

# re: Saber si una página aspx que devuelve una imagen, la devuelve o no???

Holas Luis!

Si sabemos que esa página aspx siempre devuelve imágenes, una forma de no usar tryCatch sería verificando el tamaño del stream mayor que cero. Claro eso depende del escenario, en que casos no existiría una imagen?

También se podría verificar si hubo response o no de la página. Es decir tratar de descartar las cosas visibles con if/else antes de entrar a try/catch.

Por cierto, no se ve todo el ancho de tu código, creo que este skin no te favorece.

Saludos,

Wednesday, January 17, 2007 10:36 AM por Sergio Tarrillo

# re: Saber si una página aspx que devuelve una imagen, la devuelve o no???

OK Sergio ya he cambiado el Skin ;)

En cuanto a lo del tamaño del Stream, si intentas hacer esto:

System.IO.Stream receiveStream = response.GetResponseStream();

Response.Write(receiveStream.Length);

Te salta la excepción:

Esta secuencia no es compatible con operaciones de búsqueda.

Por eso no pude acceder a ciertas propiedades del Stream, pero lo del Length lo pensé desde el principio.

Salu2.

Wednesday, January 17, 2007 11:32 AM por Luis Ruiz Pavón