Como modificar web.config sin reiniciar la aplicacion ASP.NET

Cualquier programador ASP.NET sabe que las aplicaciones ASP.NET centralizan su configuracion en el archivo llamado web.config. Es sin duda una de las grandes mejoras que trajo ASP.NET.

El problema es que cuando modificamos este archivo la aplicación se recompila automáticamente. Esto implica que - si existen sesiones activas -  todos los usuarios activos perderán su sesión y todas las variables almacenadas en ella ...

Esto es debido a que por defecto la Session se almacena en la memoria del propio proceso de ASP.NET. Cuando modificamos el archivo web.config estamos cambiando la configuracion del proceso por lo que se reinicia y la información de Session se pierde.

Podemos modificar este comportamiento - a través de la clave sessionState - para almacenar la session en otro proceso, un servidor dedicado o incluso en SQL Server.

Sin embargo, cuando lo que queremos es simplemente cambiar algún parametro de configuración - normalmente en appSettings - que la aplicacion se reinicie puede ser excesivo. Por eso, a partir de la version 2.0 de ASP.NET se incluye el atributo "configSource" que permite que las claves appSettings y connectionStrings lean sus valores de un archivo externo.

A través de este atributo definimos estos datos en un archivo externo sin afectar al proceso de la aplicacion.

Veamoslo con un ejemplo. En mi caso he utilizado VS2008 y C#.

Creamos un nuevo sitio Web. Lo primero que vamos a hacer es añadir un archivo Global.asax y codificar el evento Session_Start. Cuando se inicia la session grabamos la fecha del sistema en una variable -"StartDate"-, de esta forma podrémos determinar si se ha reiniciado el proceso o no (y si estamos obteniendo el resultado deseado : mantener la Session al modificar la configuracion).

 

void Session_Start(object sender, EventArgs e)

{

// Code that runs when a new session is started

Session["StartTime"] = DateTime.Now;

}

Sobre la página por defecto del sitio - Default.aspx - incluimos varios controles label, que mostrarán el valor de inicio de la session (el valor que grabamos en el Session_Start), la fecha actual del sistema y el valor de una clave de configuracion "prueba". El código se muestra a continuacion:

 

<%@ Page Language="C#" AutoEventWireup="true"

CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//.../xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>Devjoker.com</title>

</head>

<body>

<form id="form1" runat="server">

<asp:Label ID="Label1" runat="server"

Text="Hora de inicio de Session:"></asp:Label>

<asp:Label ID="lblHoraInicio" runat="server" Text=""></asp:Label>

--

<asp:Label ID="label2" runat="server"

Text="Hora de actual:"></asp:Label>

<asp:Label ID="lblAhora" runat="server"

Text=""></asp:Label>

<br /><br />

<asp:Label ID="lblAppConfig" runat="server"></asp:Label>

<br />

</form>

</body>

</html>

Y el evento Page_Load de la página:

 

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

DateTime hora =

Convert.ToDateTime ( Session["StartTime"].ToString());

lblHoraInicio.Text = hora.ToString("dd/MM/yyyy HH:mm:ss");

string value = ConfigurationManager.AppSettings["prueba"];

lblAppConfig.Text = value;

lblAhora.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");

}

}

Ahora sobre el archivo de configuracion web.config añadimos valores a la clave de configuracion appSettings como se muestra a continuación.

 

<configuration>

<!--Web config-->

<appSettings >

<add key="prueba" value="Valor de prueba."/>

<add key="prueba2" value="Este es otro valor nuevo."/>

</appSettings>

</configuration>

Ejecutamos la aplicación, y podemos observar que cada vez que cambiamos el valor de la clave "prueba" del appSettings, el valor de la variable de Session "StartDate" se inicializa con la hora del sistema. Es decir, el proceso se está reiniciando y el evento Session_Start se está ejecutando.

Ahora vamos a cambiar el archivo web.config para que lea las claves de appSettings de un archivo externo. Añadimos a nuestro proyecto el archivo OutApp.config - importante:la extension del archivo debe ser .config para que el framework impida su descarga a tarvés de un navegador -. Los archivos quedan del siguiente modo:

 

<configuration>

<!-- Web config -->

<appSettings configSource="OutApp.config" />

</configuration>

Y el archivo OutApp.config - tal cual , solo la seccion appSettings:

 

<appSettings >

<add key="prueba" value="Valor de prueba."/>

<add key="prueba2" value="Este es otro valor nuevo."/>

</appSettings>

 Ahora repetimos la prueba anterior. Ejecutamos la aplicacion y cambiamos los valores de configuracion de appSettings, podemos observar que al refrescar la página, la hora de inicio de Session no varia, es decir, el proceso no se está reiniciando. Objetivo cumplido.

Las claves que permiten el uso del atributto "configSource" son appSettings y connectionStrings, pero mi recomendacion es que solo lo usemos sobre appSettins ya que si cambiamos de base de datos quizas lo mas conveniente sea "recliclar" a los usuarios.

Como añadido final, comentar este link http://weblogs.asp.net/cibrax/archive/2007/07/24/configsource-attribute-on-system-servicemodel-section.aspx que explica como utilizar está tecnica para configurar servicios de WCF.

Saludos, DJK

 

Pedro  Herrarte  Sánchez
Como modificar el web.config sin reiniciar la aplicacion ASP.NET
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:06/04/2009
Última actualizacion:06/04/2009
Visitas totales:22720
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com