Sitios Web o Aplicaciones Web en Visual Studio 2005/2008: ¿cuál utilizar?

Como seguramente sabrás, con la aparición de Visual Studio 2005 el modelo de troyectos Web cambió completamente. Se pasó de un modelo "code-behind" a un modelo "code-beside" (que ahora explicaré con calma), y la estructura de aplicaciones anteriores dejó de ser compatible con ASP.NET 2.0. Esto hacía complicado, sobre todo, la migración de las aplicaciones desde ASP.NET 1.x a las nuevas versiones, y desató muchas protestas (aunque muchos protestaron simplemente por inmovilismo y reticencia al cambio). Ante ello Microsoft respondió unos meses después sacando los Visual Studio 2005 Web Application Projects. Éstos añadían compatibilidad con el modelo anterior a Visual Studio 2005, y de hecho se convirtió en una parte estándar del entorno al salir el Service Pack de VS2005. Ahora forman parte integrada desde el principio de Visual Studio 2008 también.

A la hora de crear un proyecto nuevo para la Web podemos elegir entre crear un sitio Web (opción por defecto):

o crear un proyecto de tipo Aplicación Web, para lo cual hay que ir por el diálogo "normal", como si fueras a crear una aplicación de Windows o cualquier otro proyecto:

Pero, ¿qué diferencia hay y cuál me conviene utilizar?

Primero voy a comentar las diferencias más resaltables, en mi opinión, por apartados

1.- Acceso al código fuente

En las aplicaciones Web el código completo de la página está disponible en el/los archivo(s) .cs o .vb correspondiente(s) a la página. Me estoy refiriendo aquí a las declaraciones de los controles y otros entresijos de la página que realmente deberían ser transparentes para los programadores.

En los proyectos de tipo Sitio Web esto se esconde completamente y todo este código de "fontanería" (como dicen los yankees) se genera dinámicamente en tiempo de compilación. Sólo vemos nuestros manejadores de eventos y métodos de página,pero no todo el código que hay por debajo para declarar controles, sus eventos, etc... Es lo que se llama "code-beside", ya que el código se genera en tiempo de compilación en una clase parcial extra que nosotros no vemos y que se llama igual la página pero precedida por un guión bajo (por ejemplo _Default).

Esto hace que algunos piensen que pierden control cuando la realidad es que, salvo en contadísimas ocasiones (no me preguntes cuáles), a ese código automático no le vas a tocar y además tampoco conviene hacerlo pues en cada cambio a la página original podrías perderlo, ya que se genera automáticamente igual.

De hecho cuando generas un proyecto de aplicación web esta clase parcial la puedes ver en el archivo mipagina.aspx.designer.cs o similar, pero como puedes comprobar en este caso, poco más que verlo podrás haer con él y no aporta nada (a mi por lo menos).

Una cosa que sí puede ser importante respecto al código fuente es que en los sitios web el código de nuestras clases que no pertenezca a una página sólo puede estar ubicado en la carpeta especial App_Code y sus subcarpetas. En las aplicaciones web puedes tener clases en donde quieras y todas ellas se leerán y compilarán sin problema. Desde mi punto de vista esto sólo es una ventaja si estás migrando código viejo de 1.x, porque si se trata de un proyecto nuevo me parece mucho más ordenado -y por lo tanto mucho menos propenso a errores o despistes- el tener todo el código ordenado en una misma carpeta. Además en proyectos grandes el código realmente lo tendrás repartido por otros proyectos de biblioteca de clases (que generan DLLs) determinando la capa de negocio, etc...

Por otro lado los sitios web puedes abrirlos desde Visual studio sin necesidad de tener un archivo de proyecto asociado a éstos (un .csproj o .vbproj). Simplemente navegas hasta la carpeta y la abres y ya puedes trabajar. En las aplicaciones Web, al igual que en 1.x, necesitas estos archivos. Mucho más cómodo lo primero y más fñacil transportar los proyectos entre equipos.

2.- Compilación

En los proyectos de Sitio Web al precompilar la aplicación se genera una DLL por cada página o control de la aplicación, las cuales van dentro del directorio Bin. En los proyectos de tipo Aplicación Web se genera una única DLL que contiene el código completo de la aplicación, la cual se debe cargar en memoria sea necesario todo el código o no. En mi opinión es más interesante lo segundo por varias razones, pero sobre todo por un uso más eficiente de la memoria ya que sólo se carga lo que se necesita.

Además hay otra cuestión y es que si haces un cambio en una única página en el caso de las aplicaciones web tienes que desplegar la DLL de toda la aplicación que puede ocupar muchos megas, todo por un simple cambio, mientras que en el otro caso puedes copiar simplemente la DLL correspondiente a esa página o control concretos y ya llegaría.

Es cierto, usando DLLs independientes el rendimiento puede bajar un poquillo en la carga inicial de cada una de ellas mientras que en el otro caso sólo se carga una DLL, pero creo que las ventajas superan ampliamente este inconveniente. Por otro lado también es cierto que si hay que realmente cargar todas las DLL independientes en memoria éstas pueden llegar a ocupar más memoria que la DLL única, pero por otro lado si sólo se usan algunas partes de la aplicación en un momento dado el uso de memoria es inferior en el caso de los sitios web.

Finalmente hay un problema que se da cuando tenemos sitios web muy grandes, con miles de páginas, y hay que cargar todas esas DLLs en memoria, ya que cuando se trata realmente de miles de DLLs el rendimiento se degrada e incluso hay un límite en el número que podemos de ellas cargar. De todas formas cuando hay miles de estas páginas normalmente será porque éstas se generan automáticamente por algún motivo (no es algo muy usual) y existe una solución muy sencilla para resolverlo. De este tema concreto hablaré en el próximo post.

3.- Uso de Master Pages

Las Master Pages (o páginas principales como lo han traducido, horriblemente en mi opinión) son una de las características más interesantes de ASP.NET 2.0 ya que te permiten reutilizar la distribución y funcionalidad de una o varias plantillas entre diversas páginas de tu aplicación. Si ya has definido al menos una Master Page en tu sitio web, al añadir una nueva página ASPX tienes un diálogo como este:

Si te fijas, en la parte inferior hay una marca para seleccionar la Master Page que quieres utilizar, dándote a escoger de una lista de las disponibles al agregar la nueva página. Esto facilita mucho el trabajo.

Sin embargo en las aplicaciones Web, aunque las Master Pages están soportadas, el añadirlas no es tan inmediato, al emnos a primera vista. De hecho esto lo cuento porque la primera vez que las utilizas te puedes ver despistado.

La forma más directa y rápida de añadir una nueva página que haga uso de una Master Page existente es utilizar un elemento del menú contextual de éstas que puede que pase inadvertido:

Al hacerlo se crea una página ASPX que utiliza como MP la seleccionada en el menú contextual. Y es que en los proyectos de aplicación Web se dispone de un tipo especial de página ASPX llamado Content Page o Página de Contenidos que sirve para estos propósitos. Así, al añadir una nueva página podemos escoger en el diálogo entre ambos tipos, pero hayq ue darse cuenta de ello:

En los sitios web esta distinción artificiosa no existe y todas las páginas son iguales a los ojos del programador :-)

4.- Uso de la funcionalidad Profile

Otra cosa interesante de ASP.NET 2.0 o superior es la posibilidad de definir de antemano ciertas propiedades que queremos asociar a los usuarios para manejarlas como si se tratara de sus preferencias. Estas preferencias se manejan con la clase Profile y deben estar coordinadas con la definición de las mismas en el web.config. Resulta que en las aplicaciones Web no ofrecen funcionalidad para definir estas propiedades en tiempo de diseño y además la clase Profile no se añade a las páginas automáticamente. No funcionaba en la primera versión liberada, no funcionó en el Service Pack de VS2005 y, sorprendentemente, no funciona tampoco en Visual Studio 2008.

Por suerte el bueno de Joe Wrobel, de Microsoft, ha creado un proyecto llamado "Web Profile Builder for Web Application Projects", que permite añadir esta funcionalidad a las páginas ASPX de nuestros proyectos de aplicación Web. Pero vamos, no deja de ser un parche que debemos arrastrar y que no está soportado oficialmente.

Mi opinión

Si debes migrar de ASP.NET 1.x usa aplicaciones Web. Si empiezas un proyecto nuevo mejor usa un sitio Web.

¿Y tú qué opinas?

Archivado en:
Comparte este post:

Comentarios

# phito said:

¿Por qué no se escribió este post hace 2 meses? jejeje acabo de terminar una aplicación web y me he encontrado con muchos tropiezos, nada que no se haya podido solventar, pero hubiese sido interesante saber las diferencias entre uno y otro tipo de proyecto.

Gracias, lo tendré en cuenta.

Monday, January 19, 2009 3:04 PM
# Juan Quijano said:

Amen, hermano.

Todo lo que has dicho es cierto y además muy bien contado.

Monday, January 19, 2009 6:30 PM
# Fernando Gómez García said:

Me estoy iniciando con Visual 2008 en desarrollos Web y me encuentro con algunos inconvenientes. Por decir el primero, es que al crear un nuevo sitio Web y ejecutar su depuración, no se muestra la página. Me indica que internet explorer no puede cargar la página. Ya desmarque la opción "deshabilitar ejecución de scripts de internet explorer" en las opciones de internet y no consigo solucionar el detalle. Espero me puedas orientar. Tengo Windows Vista como SO.

Friday, March 20, 2009 12:50 AM
# Angel said:

Hola, muy interezado en conocer de que manera puedo generar dll desde esta version de visual studio (visual Studio 2008) y que las pueda utilizar por ejemplo en excel, ya que lo he intentado y no me permite registrarla de la forma como lo estoy haciendo.

Gracias

Wednesday, May 6, 2009 6:34 PM
# Mar said:

Hola, tal vez proba  ver  si  tienes instalado  el SP1 de VS2008. A mi me funciono. Arriba

Thursday, November 12, 2009 11:06 PM
# Rojas said:

El problema de utilizar Sitio Web, empieza cuando quieres manejar los Delegados de una Master Page, enlazados a las paginas que esta contiene, me paso y la única solución que encontré fue utilizar Aplicación Web

Thursday, February 25, 2010 3:58 PM
# José M. Alarcón Aguín said:

Hola Rojas:

En realidad no debería haber ninguna diferencia en eso que comentas. ¿No spones un ejemplo? Gracias

Saludos

JM

Friday, February 26, 2010 9:39 AM
# shak said:

estoy siguiendo un tutorial donde me pide hacer una Aplicación Web, pero no aparce la pantilla como se indica en este POST

Nuevo Proyecto---- c#--- Web---Proyecto Web ASP.NET

Tuesday, March 23, 2010 9:38 PM
# lucas said:

mira cuando quiero crear un "proyecto" sae cual sea me salta error de algo llamado .vbproj diciendo que no es compatible con mi vercion de la aplicación pero ya baje 10 versiones y ninguna anda :S

dejo mi msn por si alguno me puede contestar!

lucass.ldp@hotmail.com

Wednesday, May 5, 2010 5:24 PM
# carlos said:

el captcha falla.

Si alteras el orden de lás 2 últimas letras pasa, y mucho más. Solo tenéis que probarlo.

Thursday, July 22, 2010 12:03 AM
# carlos said:

kk de captcha. Lo siento, no tengo nada en contra del foro. De echo el artículo es muy interesante. Pero la gente debe saber que utilizar este captcha no es seguro.

Thursday, July 22, 2010 12:08 AM
# José M. Alarcón Aguín said:

Hola Carlos:

No es que falle el captcha, es que Recaptcha está diseñado para trabajar así.

Su negocio es la digitalización de libros y usan el Captcha para determinar qué ponen algunas palabras. Por eso, una de ellas es desconocida y recogen la opinión de lo que pone de mucha gente para determinar qué pone realmente. La otra siempre es conocida. Por eso, aunque una de ellas (la desocnocida) la pongas mal cambiando alguna letra no pasa nada y te deja continuar, pues lo tuyo es sólo un voto para esa palabra. Ese es el motivo. Alucinante lo de esta gente (a mi al menos me parece super-interesante).

Saludos!

JM

Thursday, July 22, 2010 10:12 AM
# kathita said:

hola, me gustaria por favor si pudieras pasarme una aplicaion web o web site hecha en c# utiizando visual studio, lo quiero para estudia y guiarme, s estuviera en 3 capas mejor control de inventario, facturacion, algo, urgente, muchas gracias de antemano. Dios te bendiga

Friday, January 28, 2011 6:14 AM