Acceder a propiedades/atributos de secciones del web.config mediante codebehind

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">
 
Aqui veremos
    • 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
Aqui estan…
  • 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

image 
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/salvar

image

Tambien lo tendremos de la forma anterior

 image

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…

Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~")
Dim seccion As SessionStateSection = CType(webConfig.GetSection("system.web/sessionState"), SessionStateSection)
txtSessionStateTimeout.Text = seccion.Timeout

Pero lo tenemos todas las propiedades disponibles…

image

  • 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:

 

 

 

NOTA: Secciones especificas AppSettings y ConnectionStrings

Existen “atajos” para secciones especificas (“archi-conocidas”) de nuestros archivos de configuracion como ser AppSettings y ConnectionStrings

image

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:

image  

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.

image 

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:

Un comentario en “Acceder a propiedades/atributos de secciones del web.config mediante codebehind”

  1. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *