Blog Recent Posts

This Blog

Syndication

Search

Tags

News

Community

Email Notifications

Archives

Blogs recomendados

Sitios

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:

Published 29/7/2008 15:40 por José A. Fernández

Archivado en:
Comparte este post:

Comentarios

# re: Acceder a propiedades/atributos de secciones del web.config mediante codebehind@ Wednesday, August 5, 2009 11:52 PM

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.

Anónimo