Cambiando la respuesta de una página ASPX

martes, 26 de enero de 2010
El cambio de respuesta de una página web (en general) es una práctica bastante vieja, y muy útil a la hora de solucionar problemas de compatibilidad entre versiones de una misma plataforma o para pasar información entre plataformas.

Para poder realizar esta tarea en una página ASPX los pasos a seguir son bastante sencillos:

Se deberá eliminar el HTML del archivo mipagina.aspx (si es que estamos trabajando con code behind) y dejar tan solo la directiva de la página.

En el archivo mipagina.aspx.cs (en el page load para el caso del demo de mas adelante) es necesario pasar ciertos datos al objeto Response, éste se encarga de devolver la respuesta a la solicitud recibida por el cliente, y es en este paso que nosotros vamos a configurar esa respuesta de acuerdo a nuestras necesidades.


  • Definir el tipo de contenido usando la propiedad ContentType para tener una lista completa de los valores que podemos usar en esta propiedad se puede consultar el siguiente sitio web http://msdn.microsoft.com/en-us/library/ms775147(VS.85).aspx#Known_MimeTypes
  • Si el tipo de respuesta es en algún contenido que pueda ser desplegado en el navegador (documento de texto, imagenes, etc.) tenemos que declarar el mismo en un header (cabecera) que describe el contenido a ser desplegado y la forma de hacerlo, por razones didácticas vamos a ver 2 opciones, inline y attacch
  • Una vez configurado el response debemos escribir en el buffer lo que deseamos pasarle al cliente, esta tarea se realiza a traves de varios métodos (solo 1 a la vez) de acuerdo a nuestros requerimientos, por ejemplo en el caso de archivos binarios podemos usar el metodo BinaryWrite el cual recibe un arreglo de bytes que representan la respuesta que hemos compuesto, Write que tambien recibe un arreglo de bytes que representan lo mismo pero en este caso podemos usarlo en caso de querer pasar un recurso que no necesariamente este en memoria, por ejemplo la ruta virtual de una imagen.
  • Para finalizar debemos llamar al metodo End del Response para que finalice el envio al cliente y con esto terminamos.


Si bien el ejemplo a continuación es muy básico, nos permite ver las muchas posibilidades que esta opción nos brinda.


El Código
Archivo getImage.aspx.cs
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentType = "image/jpeg";
        Response.AddHeader("Content-Disposition", "inline; filename=banner.jpg");
        Response.Write(Server.MapPath("~/images/todayscompanybanner.jpg"));
        Response.End();
    }

Archivo getImage.aspx


Otra opción de código
        using (FileStream ms = new FileStream(Server.MapPath("~/installers/20100101.zip"),FileMode.Open))
        {
            long dataLengthToRead = ms.Length;
            int blockSize = dataLengthToRead >= 5000 ? 5000 : (int)dataLengthToRead;
            byte[] buffer = new byte[dataLengthToRead];
            Response.Clear();
            Response.ClearContent();
            Response.ClearHeaders();
            Response.BufferOutput = true;
            Response.AddHeader("Content-Disposition", "attach; filename=someinstaller.zip");
            Response.ContentType = "application/octet-stream";
            while (dataLengthToRead > 0 && Response.IsClientConnected)
            {
                Int32 lengthRead = ms.Read(buffer, 0, blockSize);
                Response.OutputStream.Write(buffer, 0, lengthRead);
                Response.Flush();
                dataLengthToRead = dataLengthToRead - lengthRead;
            }
            Response.Flush();
            Response.Close();
        }
        Response.End();

0 comments:

Publicar un comentario