Precompilar el sitio web (VB)

por Scott Mitchell

Visual Studio ofrece a los desarrolladores de ASP.NET dos tipos de proyectos: proyectos de aplicación web (WAP) y proyectos de sitio web (WSP). Una de las principales diferencias entre los dos tipos de proyecto es que los WAP deben tener el código compilado explícitamente antes de la implementación, mientras que el código de un WSP se puede compilar automáticamente en el servidor web. Sin embargo, es posible precompilar un WSP antes de la implementación. En este tutorial se exploran las ventajas de la precompilación y se muestra cómo precompilar un sitio web desde Visual Studio y desde la línea de comandos.

Introducción

Visual Studio ofrece a los desarrolladores de ASP.NET dos tipos de proyecto diferentes: proyectos de aplicaciones web (WAP) y proyectos de sitio web (WSP). Una de las principales diferencias entre estos tipos de proyecto es que los WAP requieren compilación explícita, mientras que los WSP usan compilación automática de forma predeterminada. Con los WAP, se compila el código de la aplicación web en un único ensamblado, que se crea en la carpeta Bin del sitio web. La implementación implica copiar el contenido de marcado (los archivos .aspx.ascx y .master) en el proyecto, junto con el ensamblado de la carpeta Bin; los propios archivos de clase de código subyacente no necesitan implementarse. Por otro lado, puede implementar un WSP copiando las páginas de marcado y sus clases de código subyacente correspondientes en el entorno de producción. Las clases de código subyacente se compilan a petición en el servidor web.

Nota:

Consulte la sección "Compilación explícita frente a compilación automática" del tutorial Determinación de los archivos que se deben implementar para obtener más información sobre las diferencias entre los modelos de proyecto, la compilación explícita y automática, y cómo afecta el modelo de compilación a la implementación.

La opción de compilación automática es sencilla de usar. No hay ningún paso de compilación explícito y solo es necesario implementar los archivos que se han modificado, mientras que la compilación explícita requiere la implementación de las páginas de marcado modificadas y el ensamblado recién compilado. Sin embargo, la implementación automática tiene dos posibles inconvenientes:

  • Dado que las páginas deben compilarse automáticamente cuando se visitan por primera vez, puede haber un retraso breve pero notable cuando se solicita una página de ASP.NET por primera vez después de implementarse.
  • La compilación automática requiere que tanto el marcado declarativo como el código fuente estén presentes en el servidor web. Esta puede ser una opción no atractiva si planea vender la aplicación web a los clientes que lo instalarán en sus servidores web.

Si cualquiera de los dos defectos anteriores son un obstáculo, puede cambiar al modelo WAP o precompilar el WSP antes de la implementación. En este tutorial se examinan las opciones de precompilación más adecuadas para un sitio web hospedado y se recorren el proceso de precompilación y la implementación de un sitio web precompilado.

Información general sobre la generación y compilación de código de ASP.NET

Antes de examinar las opciones de precompilación disponibles, primero hablaremos sobre la generación y la compilación de código que se produce cuando se solicita una página de ASP.NET por primera vez desde que se creó o se actualizó. Como sabe, las páginas ASP.NET se componen de dos partes: marcado declarativo en el archivo .aspx y una parte del código fuente, normalmente en un archivo de clase de código subyacente independiente (.aspx.vb). Los pasos realizados por el runtime cuando se solicita una página ASP.NET dependen del modelo de compilación de la aplicación.

Con los WAP, el código fuente de las páginas debe compilarse explícitamente en un único ensamblado antes de implementarse. Durante la implementación, este ensamblado y las distintas páginas de marcado se copian en el entorno de producción. Cuando una solicitud llega al servidor web para una página ASP.NET, el runtime crea una instancia de la clase de código subyacente de la página e invoca su método ProcessRequest, que inicia el ciclo de vida de la página y, en última instancia, genera el contenido de la página, que se devuelve al solicitante. El runtime puede funcionar con la clase de código subyacente de la página ASP.NET porque la clase de código subyacente ya se compiló en un ensamblado antes de la implementación.

Con los WSP y la compilación automática, no hay ningún paso de compilación explícito antes de la implementación. En su lugar, la implementación implica copiar tanto el contenido declarativo como el código fuente en el entorno de producción. Cuando una solicitud llega al servidor web para una página ASP.NET por primera vez desde que la página se ha creado o actualizado, el runtime debe compilar primero la clase de código subyacente en un ensamblado. Este ensamblado compilado se guarda en la carpeta %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files, aunque la ubicación de esta carpeta se puede personalizar a través del elemento <pages> en Web.config. Dado que el ensamblado se guarda en el disco, no es necesario volver a compilarlo en las solicitudes posteriores a la misma página.

Nota:

Como cabría esperar, hay un ligero retraso al solicitar una página por primera vez (o por primera vez desde que se ha modificado) en un sitio que usa la compilación automática, ya que tarda un poco en compilar el código de la página y guardar el ensamblado resultante en el disco.

En resumen, con la compilación explícita, es necesario compilar el código fuente del sitio web antes de la implementación, lo que evita que el runtime tenga que realizar ese paso. Con la compilación automática, el runtime controla la compilación del código fuente de las páginas, pero con un ligero costo de inicialización para la primera visita a la página desde que se creó o actualizó por última vez.

¿Pero qué ocurre con la parte declarativa de las páginas ASP.NET (el archivo .aspx)? Es obvio que hay una relación entre los archivos .aspx y el código en sus clases de código subyacente, ya que los controles web definidos en el marcado declarativo son accesibles en el código. También es obvio que el contenido de los archivos .aspx influye considerablemente en el marcado representado generado por la página. Por lo tanto, ¿cómo funciona el runtime con el texto, el HTML y la sintaxis de control web definida en el archivo .aspx para generar el contenido representado de la página solicitada?

No quiero desviarme demasiado en los detalles de implementación de bajo nivel, que varían entre los WAP y los WSP, pero en pocas palabras, el runtime genera automáticamente un archivo de clase que contiene los distintos controles web como miembros y métodos protegidos. Este archivo generado se implementa como una clase parcial en la clase de código subyacente correspondiente. (Las clases parciales permiten que el contenido de una sola clase se reparta entre varios archivos). Por lo tanto, la clase de código subyacente se define en dos lugares: en el archivo .aspx.vb que se crea y en esta clase generada automáticamente creada por el runtime. Esta clase generada automáticamente se almacena en la carpeta %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files.

La ventaja importante aquí es que para que el runtime represente una página ASP.NET tanto sus partes de código fuente como declarativas deben compilarse en un ensamblado. Con los WAP, el código fuente se compila explícitamente en un ensamblado antes de la implementación, pero el marcado declarativo debe convertirse en código y compilarse en el runtime en el servidor web. Con los WSP que usan la compilación automática, el código fuente y el marcado declarativo deben compilarse mediante el servidor web.

Es posible usar la compilación explícita con el modelo WSP. Puede compilar explícitamente la parte del código fuente, como con el modelo WAP. Además, también puede compilar el marcado declarativo.

Opciones de precompilación

.NET Framework se incluye con una herramienta de compilación de ASP.NET (aspnet_compiler.exe) que permite compilar el código fuente (e incluso el contenido) de una aplicación ASP.NET compilada mediante el modelo WSP. Esta herramienta se lanzó con .NET Framework versión 2.0 y se encuentra en la carpeta %WINDIR%\Microsoft.NET\Framework\v2.0.50727; se puede usar desde la línea de comandos o iniciarse desde Visual Studio a través de la opción Publicar sitio web del menú Compilar.

La herramienta de compilación proporciona dos formas generales de compilación: precompilación local y precompilación para la implementación. Con la precompilación local, ejecute la herramienta aspnet_compiler.exe desde la línea de comandos y especifique la ruta de acceso al directorio virtual o la ruta de acceso física de un sitio web que reside en el equipo. A continuación, la herramienta de compilación compila cada página ASP.NET del proyecto, almacenando la versión compilada en la carpeta %WINDIR%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files igual que si las páginas se hubieran visitado por primera vez desde un explorador. La precompilación local puede acelerar la primera solicitud realizada a las páginas ASP.NET recién implementadas en el sitio, ya que reduce el runtime de la necesidad de realizar este paso. Sin embargo, la precompilación local no es útil para la mayoría de los sitios web hospedados porque requiere que pueda ejecutar programas desde la línea de comandos del servidor web. En entornos de hospedaje compartidos, no se permite este nivel de acceso.

Nota:

Para obtener más información sobre la precompilación local, consulte Procedimiento: precompilación en sitios web ASP.NET y Precompilación en ASP.NET 2.0.

En lugar de compilar las páginas del sitio web en la carpeta Temporary ASP.NET Files, la precompilación para la implementación compila las páginas en un directorio de su elección y en un formato que se puede implementar en el entorno de producción.

Hay dos tipos de precompilación para la implementación que se exploran en este tutorial: precompilación con una interfaz de usuario actualizable y precompilación con una interfaz de usuario no actualizable. La precompilación con una interfaz de usuario actualizable deja el marcado declarativo en los archivos .aspx, .ascx y .master, lo que le permite al desarrollador ver y, si lo desea, modificar el marcado declarativo en el servidor de producción. La precompilación con una interfaz de usuario no actualizable genera páginas .aspx que son nulas de cualquier contenido y quita los archivos .ascx y .master, ocultando así el marcado declarativo y prohibiendo que un desarrollador lo cambie del entorno de producción.

Precompilación para la implementación con una interfaz de usuario actualizable

La mejor manera de comprender la precompilación de la implementación es ver un ejemplo en acción. Vamos a precompilar el WSP de opiniones de libros para la implementación mediante una interfaz de usuario actualizable. La herramienta de compilación de ASP.NET se puede invocar desde el menú Compilar de Visual Studio o desde la línea de comandos. En esta sección se examina el uso de la herramienta desde Visual Studio; la sección "Precompilación desde la línea de comandos" examina la ejecución de la herramienta del compilador desde la línea de comandos.

Abra el WSP de revisión de libros en Visual Studio, vaya al menú Compilar y seleccione la opción de menú Publicar sitio web. Esto inicia el cuadro de diálogo Publicar sitio web (véase la ilustración 1), donde podrá especificar la ubicación de destino, si la interfaz de usuario del sitio precompilado es actualizable o no y otras opciones de la herramienta de compilación. La ubicación de destino puede ser un servidor web remoto o un servidor FTP, pero por ahora elija una carpeta en el disco duro del equipo. Dado que queremos precompilar el sitio con una interfaz de usuario actualizable, deje activada la casilla "Permitir que este sitio precompilado sea actualizable" y haga clic en Aceptar.

Screenshot that highlights how the a s p dot NET compilation tool precompiles your website.

Ilustración 1: la herramienta de compilación de ASP.NET precompilará el sitio web en la ubicación de destino especificada
(Haga clic para ver la imagen a tamaño completo.)

Nota:

La opción Publicar sitio web en el menú Compilar no está disponible en Visual Web Developer. Si usa Visual Web Developer, deberá usar la versión de la línea de comandos de la herramienta de compilación de ASP.NET, que se trata en la sección "Precompilación desde la línea de comandos".

Después de precompilar el sitio web, vaya a la ubicación de destino que escribió en el cuadro de diálogo Publicar sitio web. Dedique un momento a comparar el contenido de esta carpeta con el contenido de su sitio web. En la ilustración 2 se muestra la carpeta del sitio web opiniones de libros. Tenga en cuenta que contiene archivos .aspx y .aspx.cs. Además, tenga en cuenta que el directorio Bin incluye solo un archivo, Elmah.dll, que se agregó en el tutorial anterior

Screenshot that shows the dot a s p x and dot a s p x dot c s files in the project directory.

Ilustración 2: el directorio del proyecto contiene archivos .aspx y .aspx.cs; la carpeta Bin incluye solo Elmah.dll
(Haga clic para ver la imagen a tamaño completo.)

En la ilustración 3 se muestra la carpeta de ubicación de destino cuyo contenido creó la herramienta de compilación de ASP.NET. Esta carpeta no contiene ningún archivo de código subyacente. Además, el directorio Bin de esta carpeta incluye varios ensamblados y dos archivos .compiled además del ensamblado Elmah.dll.

Screenshot that shows the files for deployment in the target location folder.

Ilustración 3: la carpeta ubicación de destino incluye los archivos para la implementación
(Haga clic para ver la imagen a tamaño completo.)

A diferencia de la compilación explícita en WAP, la precompilación para el proceso de implementación no crea un ensamblado para todo el sitio. En su lugar, agrupa varias páginas en cada ensamblado. También compila el archivo Global.asax (si está presente) en su propio ensamblado, así como en cualquier clase de la carpeta App_Code. Los archivos que contienen el marcado declarativo para las páginas web ASP.NET, controles de usuario y páginas maestras (archivos .aspx, .ascx y .master, respectivamente) se copian tal como está en el directorio de ubicación de destino. Del mismo modo, el archivo Web.config se copia directamente, junto con cualquier archivo estático, como imágenes, clases CSS y archivos PDF. Para obtener una descripción más formal de cómo la herramienta de compilación controla varios tipos de archivos, consulte Control de archivos durante la precompilación de ASP.NET.

Nota:

Puede indicar a la herramienta de compilación que cree un ensamblado por página ASP.NET, control de usuario o página maestra activando la casilla "Usar ensamblados de nombre fijo y página única" en el cuadro de diálogo Publicar sitio web. Tener cada página ASP.NET compilada en su propio ensamblado permite un control más específico sobre la implementación. Por ejemplo, si ha actualizado una sola página web ASP.NET y necesita implementar ese cambio, solo necesita implementar el archivo .aspx de esa página y el ensamblado asociado en el entorno de producción. Consulte Procedimiento: generación de nombres fijos con la herramienta de compilación de ASP.NET para obtener más información.

El directorio de ubicación de destino también contiene un archivo que no formaba parte del proyecto web precompilado, es decir, PrecompiledApp.config. Este archivo informa al runtime de ASP.NET de que la aplicación se ha precompilado y si se ha precompilado con una interfaz de usuario actualizable o no actualizable.

Por último, dedique un momento a abrir uno de los archivos .aspx de la ubicación de destino mediante Visual Studio o el editor de texto que prefiera. Al precompilar para la implementación con una interfaz de usuario actualizable, las páginas ASP.NET del directorio de ubicación de destino contienen el mismo marcado exacto que los archivos correspondientes del sitio web.

Precompilación para la implementación con una interfaz de usuario no actualizable

La herramienta del compilador de ASP.NET también se puede usar para precompilar un sitio para la implementación con una interfaz de usuario no actualizable. La precompilación del sitio con una interfaz de usuario no actualizable funciona de forma muy similar a la precompilación con una interfaz de usuario actualizable, la diferencia clave es que las páginas ASP.NET, los controles de usuario y las páginas maestras del directorio de destino se quitan de su marcado. Para precompilar un sitio web para la implementación con una interfaz de usuario no actualizable, elija la opción Publicar sitio web en el menú Compilar, pero desactive la opción "Permitir que este sitio precompilado sea actualizable" (véase la ilustración 4).

Screenshot that shows the Allow this precompiled site to be updatable option.

Ilustración 4: desactive la opción "Permitir que este sitio precompilado sea actualizable" para precompilar con una interfaz de usuario no actualizable
(Haga clic para ver la imagen a tamaño completo.)

En la ilustración 5 se muestra la carpeta de ubicación de destino después de precompilar con una interfaz de usuario no actualizable.

Screenshot that shows the target location folder for a deployment with a non-updatable U I.

Ilustración 5: carpeta de ubicación de destino para la implementación con una interfaz de usuario no actualizable
(Haga clic para ver la imagen a tamaño completo.)

Compare la ilustración 3 con la ilustración 5. Aunque las dos carpetas pueden ser idénticas, tenga en cuenta que la carpeta de interfaz de usuario no actualizable carece de la página maestra Site.master. Y mientras que la ilustración 5 incluye las distintas páginas ASP.NET, si ve el contenido de estos archivos, verá que se han quitado de su marcado declarativo y se ha reemplazado por el texto del marcador de posición: "Se trata de un archivo de marcador generado por la herramienta de precompilación y no debe eliminarse"

Screenshot that shows that the declarative markup has been removed from the a s p dot NET pages.

Ilustración 5: se ha quitado el marcado declarativo de las páginas ASP.NET

Las carpetas Bin de las ilustraciones 3 y 5 difieren más sustancialmente. Además de los ensamblados, la carpeta Bin de la ilustración 5 incluye un archivo .compiled para cada página ASP.NET, control de usuario y página maestra.

La precompilación de un sitio con una interfaz de usuario no actualizable es útil en situaciones en las que no desea que el contenido de las páginas ASP.NET sea modificado por la persona o empresa que instala o administra el sitio web en el entorno de producción. Si crea una aplicación web ASP.NET que vende a los clientes para instalar en sus propios servidores web, es posible que desee asegurarse de que no modifiquen la apariencia del sitio editando directamente las páginas .aspx que envíe. Al precompilar el sitio web con una interfaz de usuario no actualizable, envía las páginas .aspx de marcador de posición como parte de la instalación, lo que impide que los clientes examinen o modifiquen su contenido.

Precompilación desde la línea de comandos

En segundo plano, el cuadro de diálogo Publicar sitio web de Visual Studio invoca la herramienta de compilación de ASP.NET (aspnet_compiler.exe) para precompilar el sitio web. Como alternativa, puede invocar esta herramienta desde la línea de comandos. De hecho, si usa Visual Web Developer, deberá ejecutar la herramienta del compilador desde la línea de comandos, ya que el menú Compilar de Visual Web Developer no incluye la opción Publicar sitio web.

Para usar la herramienta del compilador desde la línea de comandos, empiece por colocarla en la línea de comandos y vaya al directorio del marco, %WINDIR%\Microsoft.NET\Framework\v2.0.50727. A continuación, escriba la siguiente instrucción en la línea de comandos:

aspnet_compiler -p "physical_path_to_app" -v / -f -u "target_location_folder"

El comando anterior inicia la herramienta del compilador de ASP.NET (aspnet_compiler.exe) y, a través del modificador -p, le indica que precompile el sitio web enraizado en physical_path_to_app; este valor será similar a C:\MySites\BookReviews y debe delimitarlo entre comillas.

El modificador -v especifica el directorio virtual del sitio. Si el sitio está registrado como sitio web predeterminado en la metabase de IIS, puede omitir el modificador -p y simplemente especificar el directorio virtual de la aplicación. Si usa el modificador -p, el valor que continúa con el modificador -v indica la raíz del sitio web y se usa para resolver las referencias raíz de la aplicación. Por ejemplo, si especifica un valor de -v /MySite, las referencias de la aplicación a ~/path/file se resolverán como ~/MySite/path/file. Dado que el sitio de opiniones de libros se encuentra en el directorio raíz de mi empresa de hospedaje web, he usado el modificador -v /.

El modificador -f, si está presente, indica a la herramienta de compilación que sobrescriba el directorio target_location_folder si ya existe. Si omite el modificador -f y la carpeta de ubicación de destino ya existe, la herramienta de compilación se cerrará con el error: "error ASPRUNTIME: el directorio de destino no está vacío. Elimínelo manualmente o elija otro destino".

El modificador -u, si está presente, informa a la herramienta para crear una interfaz de usuario actualizable. Omita este modificador para precompilar el sitio con una interfaz de usuario no actualizable.

Por último, target_location_folder es la ruta de acceso física al directorio de ubicación de destino; este valor será similar a C:\MySites\Output\BookReviews y debe delimitarse entre comillas.

Implementación del sitio web precompilado

En este punto hemos visto cómo usar la herramienta de compilación de ASP.NET para precompilar un sitio web mediante las opciones de interfaz de usuario actualizables y no actualizables. Sin embargo, nuestros ejemplos hasta ahora han precompilado el sitio web en una carpeta local y no en el entorno de producción. La buena noticia es que implementar el sitio web precompilado es muy sencillo y se puede hacer a través de Visual Studio o a través de algún otro mecanismo de copia de archivos, como desde un cliente FTP independiente.

El cuadro de diálogo Publicar sitio web (que se muestra en la ilustración 1) tiene una opción de ubicación de destino, que indica dónde se copian los archivos de sitio web precompilados. Esta ubicación puede ser un servidor web remoto o un servidor FTP. Al escribir un servidor remoto en este cuadro de texto, se precompila e implementa el sitio web en el servidor especificado en un paso. Como alternativa, puede precompilar el sitio web en una carpeta local y, a continuación, copiar manualmente el contenido de esa carpeta en el entorno de producción a través de FTP o algún otro enfoque.

Tener el sitio web precompilado implementado automáticamente a través del cuadro de diálogo Publicar sitio web de Visual Studio resulta útil para sitios sencillos en los que no hay diferencias de configuración entre los entornos de desarrollo y producción. Sin embargo, como se indica en el tutorial Diferencias de configuración comunes entre desarrollo y producción, no es raro que existan estas diferencias. Por ejemplo, la aplicación web de reseñas de libros usa una base de datos diferente en el entorno de producción que en el entorno de desarrollo. Cuando Visual Studio publica el sitio web en un servidor remoto, copia a ciegas la información del archivo de configuración en el entorno de desarrollo.

En el caso de los sitios con diferencias de configuración entre los entornos de desarrollo y producción, puede que sea mejor precompilar el sitio en un directorio local, copiar en los archivos de configuración específicos de producción y, a continuación, copiar el contenido de la salida precompilada en producción.

Para obtener un actualizador sobre cómo copiar archivos desde el entorno de desarrollo al entorno de producción, consulte los tutoriales Implementación del sitio web mediante un cliente FTP e Implementación de su sitio web mediante Visual Studio.

Resumen

ASP.NET admite dos modos de compilación: automático y explícito. Como se explicó en los tutoriales anteriores, los proyectos de aplicación web (WAP) usan la compilación explícita, mientras que los proyectos de sitio web (WSP) usan la compilación automática de forma predeterminada. Sin embargo, es posible compilar explícitamente un WSP antes de la implementación mediante la herramienta de compilación de ASP.NET.

Este tutorial se centra en la precompilación de la herramienta de compilación para la compatibilidad con la implementación. Al precompilar para la implementación, la herramienta de compilación crea una carpeta de ubicación de destino, compila el código fuente de la aplicación web especificada y copia estos ensamblados compilados y los archivos de contenido en la carpeta de ubicación de destino. La herramienta de compilación se puede configurar para crear una interfaz de usuario actualizable o no actualizable. Al precompilar con una opción de interfaz de usuario no actualizable, se quita el marcado declarativo de los archivos de contenido. En pocas palabras, la precompilación le permite implementar la aplicación basada en proyectos de sitio web sin incluir ningún archivo de código fuente y con el marcado declarativo eliminado, si lo desea.

¡Feliz programación!

Lecturas adicionales

Para obtener más información sobre los temas tratados en este tutorial, consulte los siguientes recursos:

AnteriorSiguiente /previous-versions/aspnet/bb398860(v=vs.100)