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

💪🏻 ┬┐Este post te ha ayudado?, ┬┐has aprendido algo nuevo?
Pues NO te pido que me invites a un caf├ę... Te pido algo m├ís f├ícil y mucho mejor

Escrito por un humano, no por una IA