Por unas preguntas de los grupos de noticias de ASP.NET o de los foros de MSDN Latam, me dicidi a escribir la formas que tenemos de acceder desde codigo a propiedades/atributos de nuestras secciones en el web.config. Tambien un articulo que tenia en borrador de como modificar el tema del sitio del web.config
Empecemos por las clases que nos ayudan…
Tenemos por un lado el WebConfigurationManager, que como el nombre lo indica nos brinda manipular archivos de configuracion web. Debemos usar “preferentemente” esta clase para aplicaciones web, si quieres acceder a configuracion de aplicaciones winform/desktop utilizaremos ConfigurationManager.
Cuando necesitemos accesar en tiempo de diseño a la configuracion, por ejemplo creando webcontrol personalizados que cambien o modifican configuraciones de aplicacion utilizaremos WebConfigurationManager, idem cunado necesitamos aceder a configuracion de app de escritorio ConfigurationManager. Si el acceso lo realizamos en tiempo de ejecucion es indistinto.
Como obtener una seccion
Para este ejemplo utilizamos el acceso a la seccion pages bien simple solamente con el tema de las paginas
<pages theme="Yoda">
- OPCION 1: Metodo estáticos de la clase ConfigurationManager
- OPCION 2: Utilizando la clase WebConfigurationManager
- OPCION 3: Utilizando una instancia de la clase WebConfigurationManager con secciones especificas
- OPCION 4: Utilizando el metodo estatico (shared) GetWebApplicationSection de la clase WebConfigurationManager
- OPCION 1: Metodo estáticos de la clase ConfigurationManager
Aqui utilizamos GetSection (tambien tenemos disponible GetSectionGroup)
Ejemplo:
Dim seccion As ConfigurationSection = ConfigurationManager.GetSection("system.web/pages") txtTemaActual.Text = seccion.ElementInformation.Properties("theme").Value
- OPCION 2: Utilizando la clase WebConfigurationManager
Aqui hacemos uso de la clase que nos recomienda .NET para manipular archivos web.config. Pero igualmente seguismos sin intellisense en las propiedades de la seccion
Ejemplo:
Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~") Dim seccion As ConfigurationSection = webConfig.GetSection("system.web/pages") txtTemaActual = seccion.ElementInformation.Properties("theme").Value
- OPCION 3: Utilizando una instancia de la clase WebConfigurationManager con secciones especificas
Para tener un poco mas de “poder”Ejemplo 1 (seccion pages):
Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~") Dim seccionPages As PagesSection = CType(webConfig.GetSection("system.web/pages"), PagesSection) txtTemaActual.Text = seccionPages.Theme
Nota: si pueden apreciar que tenemos GET y SET para poder manipular esta propiedad… algo que necesitamos si queremos modificar el valor y volverlo a guardar/salvarTambien lo tendremos de la forma anterior
Ejemplo 2 (con la seccion sessionState):
Si tenemos la seccion
<web.config> ... <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20" /> ...Para recuperar el Timeout…
- OPCION 4: Utilizando el metodo estatico (shared) GetWebApplicationSection de la clase WebConfigurationManager
Aqui con menos codigo (que siempre es bueno) . No tendremos que enviar como parametro ninguna ubicacion como los anteriores. Sino simplemente toma el valor del archivo de configuracion de la aplicacion web actual
Dim seccion As PagesSection = WebConfigurationManager.GetWebApplicationSection("system.web/pages") txtTemaActual.Text = seccion.Theme
Es recomendable castear al tipo que
Dim seccion As PagesSection = TryCast(WebConfigurationManager.GetWebApplicationSection("system.web/pages"), PagesSection)
Como guardar modificaciones de una seccion
Ya tenemos la seccion, podremos modificar pero para que el cambio sea efectivo y se persista en el web.config?
Nuestra clase de configuracion tiene dos metodos Save y SaveAs
Por ejemplo en nuestro caso de ejemplo:
Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~") Dim seccion As PagesSection = CType(webConfig.GetSection("system.web/pages"), PagesSection) seccion.Theme = "Yoda" webConfig.Save()
Aqui estamos ejemplificando con un propiedad en una seccion, mas detalle sobre esta tarea en este articulo:
- Cambiar tema actual (app_theme) del web.config desde codebehind, por Jose A. Fernandez ;) (es el post siguiente)
NOTA: Secciones especificas AppSettings y ConnectionStrings
Existen “atajos” para secciones especificas (“archi-conocidas”) de nuestros archivos de configuracion como ser AppSettings y ConnectionStrings
Pero en definitiva son objetos AppSettingsSection y ConnectionStringsSection, que nos duevuelve directamente los que necesitamos.
En el caso de AppSettings nos devuelve la coleccion de NameValueCollection
En el caso de las cadenas de conexion nos devuelve la coleccion ConnectionStringSettingsCollection, sino tendriamos que hacer algo asi:
Para modificar si queremos hacer algo asi:
WebConfigurationManager.ConnectionStrings("EJEMPLOConn").ConnectionString = "NuevaCadena..."
Tendremos un error:
La configuración es de sólo lectura.
Detalles de la excepción: System.Configuration.ConfigurationErrorsException: La configuración es de sólo lectura.
para guardar la cadena de conexion modificada…
Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~") Dim seccionConnString As ConnectionStringsSection = CType(webConfig.GetSection("connectionStrings"), ConnectionStringsSection) seccionConnString.ConnectionStrings("EJEMPLOConn").ConnectionString = "NuevaCadena..." webConfig.Save()
Enlaces:
-
WebConfigurationManager.OpenWebConfiguration
Abre el archivo de configuración de la aplicación Web como un objeto Configuration utilizando la ruta de acceso virtual especificada para permitir operaciones de lectura o escritura.
Gracias me sirvió de mucho estos comentarios, yo tenía el problema en que solo lo escribia en memoria pero ya con este código que mencionas lo puedo escribir en el archivo.
Saludos.