El otro d铆a os comentaba las diferencias entre los proyectos de tipo Sitio Web y Aplicaci贸n Web en Visual Studio, y las implicaciones que ello ten铆a a la hora de trabajar, para ayudaros a decidir entre uno u otro.

Una de las "pegas" que le pon铆a al modelo de sitios Web era que al generarse una DLL por cada p谩gina y control, al final pod铆amos acabar con problemas de rendimiento por tener que haber cargado todas esas DLL en el proceso de la aplicaci贸n.

He puesto "pegas" entre comillas porque realmente desde mi punto de vista esta posible situaci贸n m谩s que un problema es un exotismo, puesto que no me imagino ninguna aplicaci贸n Web realista que tenga miles de p谩ginas (hablo de varios miles) y que no est茅 dotada del ag煤n mecanismo de generaci贸n autom谩tica de p谩ginas.

De hecho el 煤nico sistema que he visto que pudiera provocar esta situaci贸n es un sistema gestor de contenidos creado para un organismo oficial por una conocida empresa de consultor铆a (de cuyo nombre no quiero acordarme) y que se dedicaba a generar como p谩ginas ASPX cada una de las p谩ginas de contenidos que los usuarios iban creando. En mi opini贸n el proyecto no estaba demasiado bien hecho ni concebido (y no lo digo solo por este detalle) y desde luego para este caso concreto podr铆an haber aplicado otro tipo de t茅cnicas para generar los contenidos de forma din谩mica con alto rendimiento igualmente.

En cualquier caso. Este proyecto ten铆a miles de p谩ginas generadas cuyos ensamblados que se iban cargando en memoria y degradando a largo plazo el rendimiento de la aplicaci贸n. Todas estas p谩ginas de contenidos realmente no ejecutaban c贸digo alguno sino que se limitaban a mostrar HTML y, en algunos casos, etiquetas de tipo <% %> con alguna informaci贸n.

驴C贸mo pod铆an evitar este problema de degradaci贸n del rendimiento?

La gente del equipo de ASP.NET consciente de esta posible situaci贸n indeseable la tuvieron en cuenta y dise帽aron un ajuste que se le puede hacer a las p谩ginas para evitar que se compilen. Se trata de la opci贸n CompilationMode.

Este atributo se puede establecer en la directiva de cada p谩gina o control y puede tomar los siguientes valores:

Always: las p谩gina o control se compilan siempre, y por lo tanto se genera un ensamblado.
Never: no se compila, por lo que no se genera un ensamblado y no hay que cargarla en memoria.
Auto: es ASP.NET en tiempo de ejecuci贸n quien decide si la p谩gina se compila o no, dando preferencia a que no se compile si no es necesario.

As铆, por ejemplo, podemos definir en la directiva de una p谩gina lo siguiente para evitar su compilaci贸n:

<%@ Page CompilationMode="Auto" %>

(Nota: no se admiten en la directiva de p谩gina los atributos CodeFile, AutoEventWireup o Inherits, porque no se genera c贸digo para la p谩gina)

En estas condiciones s贸lo se permite la interpretaci贸n en tiempo de ejecuci贸n de etiquetas de tipo <%# %> o <%$ %>, pero no otro tipo de c贸digo como eventos de p谩gina. Estas etiquetas de sintaxis declarativa de ASP.NET permiten utilizar bindings a datos (ej: <%# Bind(...) %> o <%# Eval(...) %>) y tambi茅n otro tipo de expresiones declarativas como sustituci贸n de recursos de localizaci贸n o cadenas de conexi贸n en controles enlazados, sin necesidad de generar c贸digo relacionado y compilarlo.

As铆, por ejemplo, podemos escribir instrucciones como esta:

<asp:Label ID="Label1" runat="server" Text="<%$ Resources:Recursos, Saludo %>"></asp:Label>

aunque la pongamos en modo de comilaci贸n "Never" para que no se genere el ensamblado, y todo funcionar谩 correctamente. Si metemos cualquier tipo de c贸digo en la p谩gina se producir谩 un error al intentar compilar la aplicaci贸n desde Visual Studio.

As铆, en el ejemplo de p谩ginas generadas que lo 煤nico que hac铆an era mostrar contenido pre-generado (o incluso aunque 茅ste fuera sacado de una base de datos con una expresi贸n de enlazado del tipo <%# %>), si le ponemos este atributo CompilationMode a Never conseguiremos que no se genere ni se cargue en memoeria el ensamblado de la p谩gina, y un consiguiente aumento de rendimiento, tal y como se indica en la documentaci贸n.

Configurar el modo de compilaci贸n globalmente

Siguendo con nuestro ejemplo de p谩ginas generadas, si 茅stas se almacenan todas dentro de una misma carpeta o en una estructura de carpetas que cuelguen de una 煤nica carpeta ra铆z, es posible definir el modo de compilaci贸n para todas ellas al mismo tiempo usando el archivo web.config:

De este modo podemos establecer el modo al mismo tiempo para todas las p谩ginas que bajo la influencia de este web.config y no tenemos que establecerlo una por una.

Hay que tener cuidado que en ninguna de las carpetas que se ven afectadas haya p谩ginas que s铆 contengan c贸digo o fallar谩 la compilaci贸n del proyecto. Tambi茅n hay que tener cuidado si alguna de ellas utiliza una Master Page que tenga c贸digo, pues surgir谩n conflictos tambi茅n.

En resumen

Para casos muy particulares de sitios enormes en los que necesitemos asegurar que no degradamos el rendimiento, esta t茅cnica poco conocida puede resultarnos de gran ayuda. Tenla en cuenta si te encuentras algo as铆.

隆Espero que te sea 煤til!

💪🏻 驴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