Pedir una cosa y recibir otra – Parte III: Ejecutar otras páginas

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Pedir-una-cosa-y-recibir-otra-Parte-III-Ejecutar-otras-paginas.aspx

U-TurnEn la entrega anterior de esta serie vimos a fondo cómo funcionaba el método Transfer. Seguimos ahora profundizando en otros métodos relacionados.

El método Transfer por debajo lo único que hace es llamar al método Execute de la misma clase HttpUtility:

Transfer3[2]

Este método es prácticamente idéntico a Transfer, como vemos en este código, por lo que a todos los efectos podemos sustituir las llamadas a Transfer por llamadas a Execute y no perder funcionalidad.

Además, si nos fijamos en el código de Transfer de una figura anterior, llama continuación a Response.End. Esto como ya vimos en la primera parte con Redirect, tiene algunas implicaciones respecto al rendimiento debido a la generación de excepciones ThreadAbortException, por lo que en sitios muy grandes donde cada milésima cuenta puede ser interesante sustituir las llamadas a Transfer por llamadas a Execute con una posterior a CompleteRequest (repasa el primer post para verlo).

Si hacemos lo mismo que antes pero llamando a Execute en lugar de Transfer (ejemplo Execute.aspx de la descarga), esto es lo que obtenemos:

Execute[2]

Lo interesante de Execute, sin embargo, es que dispone de varias sobrecargas, algunas de las cuales ofrecen como segundo parámetro una clase TextWriter. Lo interesante de estas sobrecargas es que en lugar de devolver al cliente los resultados de la ejecución de la página, obtenemos todo el HTML dentro de esta clase especializada, para hacer con él lo que queramos y manipularlo antes de enviarlo al cliente.

Por ejemplo, en la descarga he incluido una página llamada ExecuteWriter.aspx que hace lo siguiente:

   1: protected void Page_Load(object sender, EventArgs e)

   2: {

   3:     //In this example I'm using Server.Execute to redirect the request to the P2.aspx file.

   4:     //In this case I'm using the overload that takes a TextWriter and process the resulting data later.

   5:     StringWriter res = new StringWriter();

   6:     Server.Execute("P2.aspx", res);

   7:     Response.ContentType = "text/plain";

   8:     Response.ContentEncoding = System.Text.Encoding.UTF8;

   9:     Response.Write(res.ToString());

  10: }

Primero se crea un StringWriter (un tipo especial de TextWriter) que se le pasa al método Execute como segundo parámetro para ejecutar la página P2.aspx.

El resultado de la ejecución, en lugar de enviarse al cliente se recoge dentro del StringWriter, en la variable res. Ahora podemos hacer lo que queramos con él. En este ejemplo lo que hago es enviarlo al cliente en formato texto, con lo que en la práctica lo que consigo es ver el código fuente resultante de la ejecución de ambas páginas:

Execute2[2]

En este caso se trata de un ejemplo un poco “chusquero” ya que al dejar que se ejecuten las dos páginas vemos que el código fuente resultante contiene dos cabeceras, dos cuerpos, dos formularios, etc… pero puede tener otro tipo de aplicaciones interesantes.

En el próximo post veremos cómo crear peticiones internas en el servidor pero que realicen el ciclo completo de vida de la petición.

¡Espero que te resulte útil!

¿Te ha gustado este post? – Aprende .NET con los cursos on-line tutelados de campusMVP:
·
Preparación del examen 70-515: Desarrollo Web con .NET 4.0 (Tutelado por mi)
· Desarrollo Web con ASP.NET 4.0 Web Forms (Tutelado por mi)
· ASP.NET 4.0 Web Forms desde cero (Tutelado por mi)
· Desarrollo Web con ASP.NET MVC 3
· Silverlight 4.0 – Aplicaciones Ricas para Internet (RIA)
· jQuery paso a paso para programadores ASP.NET
· Visual Studio 2010 desde cero

>> Pedir una cosa y recibir otra

Sin categoría

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *