[ASPNET] DLL y Optimización Dinámica en sitios web. Copiar DLL sin compilar todo el sitio web. Atributos optimizeCompilations y compilationMode

La pregunta básicamente es “Realizar modificaciones en algunas carpetas (BIN por ejemplo) Sin reiniciar la app

Bueno aquí debo hacer mención a Jesús Bosch que fue el que escribió este titulo en su pregunta en los foros (hace ya bastante tiempo pero lo tenia en borrador así que aquí esta para futuras referencias)

Ahora los enlaces/url a los post del foros son mas user-friendly (tienen el titulo al final), y se modifico la UI… date una vuelta por los Foros MSDN

Entonces en este post:

  1. Compilar? Muy pero muy breve introducción de compilación en ASP.NET…
  2. Cambios en BIN sin compilar todo el sitio (sin reiniciar) . Atributo optimizeCompilations
  3. Pensemos… en voz alta! Cuidados Especiales
  4. ¿Y si no queremos compilar nunca? compilationMode="Never" (solo para ASP.NET Webforms)

 

Compilar? Muy pero muy breve introducción de compilación en ASP.NET…

Como sabrás o te estas enterando si utilizas proyectos ASP.NET Websites compila el sitio en la primer petición, el codebehind y los archivos de código, lo que puedes prevenir precompilando todo el sitio que te dejo para investigar; En cambio si utilizas ASP.NET WebApp (Proyectos Web) puedes compilar en un único ensamblado, tendiendo un poco mas de “poder” sobre él (idem en proyectos MVC). Mas info sobre compilación:

Y en ASP.NET MVC? Ídem a Proyectos Web (Aplicaciones Web)… al fin y al cabo es una Proyecto Web ASP.NET solo que con componentes diferentes

Si bien a veces es bueno tener uno u otro, al realizar cambios en producción en algunos archivos reinicia la aplicación web… y allí es la pregunta:

 

Cambios en BIN sin compilar todo el sitio (sin reiniciar). Atributo optimizeCompilations

Si solamente quieres que no se reinicie todo el sitio se puede establecer el atributo optimizeCompilations en true de la sección compilation del web.config (mas info aquí)

Cuando se realizan cambios en archivos de nivel superior (léase en el global.asax, o carpetas App_Code, o BIN) se compila todo el sitio…. eso ya lo sabemos.

Textual de MSDN:

(…)Si desea poder cambiar los archivos de nivel superior sin tener que volver a compilar todo el sitio, puede establecer en true el atributo optimizeCompilations del elemento compilation en el archivo Web.config.Si el valor de optimizeCompilations es true, al cambiar un archivo de nivel superior, solo se vuelven a compilar los archivos afectados. (…)

<compilation 
optimizeCompilations="true">

Fix: para que funcione deberías tener estos hotfix dependiendo del Sistema operativo

Pero no es la panacea! deberías tener en cuenta algunos puntos…

Pensemos… en voz alta! Cuidados Especiales

(también esto esta en la pagina de MSDN)

  • Si uno no cambias alguna firma de un método, tus paginas que utilizan los assemblies (las dll) seguirán funcionado.
  • Si tienes métodos nuevos, las nuevas paginas utilizan las nuevo métodos y serán compiladas dinámicamente

NOTA Final: (…)Si desea utilizar el atributo optimizeCompilations para minimizar el tiempo de la compilación dinámica, deberá revisar atentamente cada cambio que realice en los archivos de nivel superior de un sitio y, si hay algún cambio que no sea seguro, deberá quitar temporalmente el atributo optimizeCompilations o establecer su valor en false.(…)

 

¿Y si no queremos compilar nunca? compilationMode="Never" (solo para ASP.NET Webforms)

Allí puedes utilizar la propiedad CompilationMode que sirve para establecer si se realiza o no esta acción sobre las Paginas (y/o UserControls), así que aquí estamos hablando solo de ASP.NET Webforms

O sea, debes precompilar todo el sitio (algo que hablamos mas arriba) o sino las paginas o usercontrol con código no funcionarían

Lo podemos escribir en la directiva de pagina, pero para todo el sitio va en el web.config en la seccion pages:

<configuration>
<system.web>
<pages compilationMode="Never" />
</system.web>
</configuration>

 

 

Enlaces