Como: Criar usando ConfigurationSection Custom configuração Sections
Você pode estender o conjunto padrão de definições de configuração ASP.NET com elementos de configuração XML de sua preferência.Para fazer isso, você deve criar seu próprio manipulador da seção de configuração.
O manipulador deve ser uma classe do .NET Framework que implementa a classe System.Configuration.ConfigurationSection.
Observação: |
---|
Nas versões do .NET Framework 1.0 e 1.1, um manipulador da seção de configuração tinha que implementam a interface System.Configuration.IConfigurationSectionHandler, que agora é substituída.No entanto, um exemplo de código existe no Como: Criar Custom configuração Sections usando IConfigurationSectionHandler. |
O manipulador de seção interpreta e processa as configurações definidas em elementos de configuração XML dentro de uma porção específica de um arquivo Web.config e retorna um objeto de configuração apropriado com base nas definições de configuração.O objeto de configuração que a classe do manipulador retorna pode ser qualquer estrutura de dados; ele não está limitado a nenhuma classe base de configuração ou formato de configuração.O ASP.NET usa o objeto de configuração para ler e gravar no seu elemento de configuração personalizado.
Para criar um manipulador da seção de configuração personalizado
Crie uma classe pública que herda da classe System.Configuration.ConfigurationSection, conforme ilustrado no exemplo de código a seguir.
Imports System Imports System.Collections Imports System.Text Imports System.Configuration Imports System.Xml Namespace MyConfigSectionHandler Public Class MyHandler Inherits ConfigurationSection Public Sub New() End Sub ' Add declarations for child elements and attributes like this: '<ConfigurationProperty("<propertyName>", <named parameters>)> _ 'Public Property MyAttrib1() As <type> ' Get ' Return CStr(Me("<propertyName>")) ' End Get ' Set(ByVal value As <type>) ' Me("<propertyName>") = value ' End Set 'End Property End Class End Namespace
using System; using System.Collections; using System.Text; using System.Configuration; using System.Xml; namespace MyConfigSectionHandler { public class MyHandler : ConfigurationSection { public MyHandler() { } // Add declarations for child elements and attributes like this: // [ConfigurationProperty("<propertyName>", <named parameters>)] // public <type> <PropertyName> // { // get { return (<type>)this["<propertyName>"]; } // set { this["<propertyName>"] = value; } // } } }
Adicione seu próprio código para executar o trabalho de configuração que desejar.
Por exemplo, você pode substituir o código comentado pelo código a seguir, que obtém os valores de sua seção personalizada.
Imports System Imports System.Collections Imports System.Text Imports System.Configuration Imports System.Xml Namespace MyConfigSectionHandler Public Class MyHandler Inherits ConfigurationSection Public Sub New() End Sub Public Sub New(ByVal attribVal As String) MyAttrib1 = attribVal End Sub <ConfigurationProperty("myAttrib1", DefaultValue:="Clowns", IsRequired:=True)> _ <StringValidator(InvalidCharacters:="~!@#$%^&*()[]{}/;'\|\\", MinLength:=1, MaxLength:=60)> _ Public Property MyAttrib1() As String Get Return CStr(Me("myAttrib1")) End Get Set(ByVal value As String) Me("myAttrib1") = value End Set End Property <ConfigurationProperty("myChildSection")> _ Public Property MyChildSection() As MyChildConfigElement Get Return CType(Me("myChildSection"), MyChildConfigElement) End Get Set(ByVal value As MyChildConfigElement) Me("myChildSection") = CType(value, MyChildConfigElement) End Set End Property End Class Public Class MyChildConfigElement Inherits ConfigurationElement Public Sub New() End Sub Public Sub New( _ ByVal a1 As String, ByVal a2 As String) MyChildAttribute1 = a1 MyChildAttribute2 = a2 End Sub <ConfigurationProperty("myChildAttrib1", DefaultValue:="Zippy", IsRequired:=True)> _ <StringValidator(InvalidCharacters:="~!@#$%^&*()[]{}/;'\|\\", MinLength:=1, MaxLength:=60)> _ Public Property MyChildAttribute1() As String Get Return CStr(Me("myChildAttrib1")) End Get Set(ByVal value As String) Me("myChildAttrib1") = value End Set End Property <ConfigurationProperty("myChildAttrib2", DefaultValue:="Michael Zawondy", IsRequired:=True)> _ <StringValidator(InvalidCharacters:="~!@#$%^&*()[]{}/;'\|\\", MinLength:=1, MaxLength:=60)> _ Public Property MyChildAttribute2() As String Get Return CStr(Me("myChildAttrib2")) End Get Set(ByVal value As String) Me("myChildAttrib2") = value End Set End Property End Class End Namespace
using System; using System.Collections; using System.Text; using System.Configuration; using System.Xml; namespace MyConfigSectionHandler { public class MyHandler : ConfigurationSection { public MyHandler() { } public MyHandler(String attribVal) { MyAttrib1 = attribVal; } [ConfigurationProperty("myAttrib1", DefaultValue = "Clowns", IsRequired = true)] [StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)] public String MyAttrib1 { get { return (String)this["myAttrib1"]; } set { this["myAttrib1"] = value; } } [ConfigurationProperty("myChildSection")] public MyChildConfigElement MyChildSection { get { return (MyChildConfigElement)this["myChildSection"]; } set { this["myChildSection"] = value; } } } public class MyChildConfigElement : ConfigurationElement { public MyChildConfigElement() { } public MyChildConfigElement(String a1, String a2) { MyChildAttribute1 = a1; MyChildAttribute2 = a2; } [ConfigurationProperty("myChildAttrib1", DefaultValue = "Zippy", IsRequired = true)] [StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)] public String MyChildAttribute1 { get { return (String)this["myChildAttrib1"]; } set { this["myChildAttrib1"] = value; } } [ConfigurationProperty("myChildAttrib2", DefaultValue = "Michael Zawondy", IsRequired = true)] [StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)] public String MyChildAttribute2 { get { return (String)this["myChildAttrib2"]; } set { this["myChildAttrib2"] = value; } } } }
Este exemplo usa o modelo declarativo.A classe System.Configuration.ConfigurationSection também pode ser implementada usando o modelo através de programação.Por exemplo, consulte o tópico com a visão geral da classe System.Configuration.ConfigurationSection e Classes Usadas para Criar Manipuladores de Seção Personalizados..
Para fins de comparação, este exemplo é semelhante ao código em Como: Criar Custom configuração Sections usando IConfigurationSectionHandler.No entanto, herdar da classe System.Configuration.ConfigurationSection permite exercer um melhor controle do seu manipulador de seção.Por exemplo, o arquivo de configuração no próximo procedimento dá permissão a um elemento filho chamado myChildSection para o qual o código anterior declara um ConfigurationProperty e define uma classe derivada de ConfigurationElement.Além disso, o encapsulamento da coleção de funcionalidade na classe ConfigurationElementCollection permite que você facilmente crie elementos de coleção que podem empregar elementos adicionar, remover e limpar em um arquivo de configuração.Para mais informações e exemplos, consulte ConfigurationElementCollection.
Para adicionar um manipulador de seção personalizado a um arquivo de configuração do ASP.NET
Adicione um elemento sectionGroup e um elemento section ao seu arquivo Web.config dentro do elemento configSections, conforme ilustrado no exemplo de código a seguir.É essa declaração que associa o manipulador de seção personalizado ao nome da seção.
Observação: Aninhar um elemento section em um sectionGroup é opcional, mas é recomendável para ajudá-lo a organizar melhor os dados de configuração.
Você pode adicionar declaração do manipulador de seção em um arquivo de configuração diferente daquele onde você adiciona os seus elementos de configuração personalizada garantindo que a arquivo de configuração onde o manipulador de seção é declarado é superior na hierarquia do arquivo de configuração.Para obter mais informações, consulte Hierarquia e Herança do Arquivo de Configuração do ASP.NET.
O atributo type do elemento section deve coincidir com o manifesto do conjunto de módulos (assembly) ou haverá um erro de configuração.O próprio arquivo do conjunto de módulos (assembly) deve estar no mesmo diretório de aplicativo ASP.NET que o arquivo Web.config que o define.
<configuration> <!-- Configuration section-handler declaration area. --> <configSections> <sectionGroup name="myCustomGroup"> <section name="myCustomSection" type="MyConfigSectionHandler.MyHandler, MyCustomConfigurationHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" /> </sectionGroup> <!-- Other <section> and <sectionGroup> elements. --> </configSections> <!-- Configuration section settings area. --> </configuration>
Adicione seus elementos de configuração personalizada na área de definições da seção de configuração do seu arquivo Web.config.
<configuration> <!-- Configuration section-handler declaration area. --> <!-- Configuration section settings area. --> <myCustomGroup> <myCustomSection myAttrib1="Clowns"> <myChildSection myChildAttrib1="Zippy" myChildAttrib2="Michael Zawondy "/> </myCustomSection> </myCustomGroup> <!-- Other configuration settings, like <system.web> --> </configuration>
Para acessar os dados de configuração personalizada por meio de programação.
Obtenha uma instância do seu objeto de configuração personalizada e use o método GetSection ou o método GetSection para preenchê-la.
O exemplo a seguir de uma página ASPX funciona com os exemplos anteriores para enumerar os atributos e elementos filho da seção de configuração personalizada.
<%@ Page Language="C#" %> <script > protected void Button1_Click(object sender, EventArgs e) { MyConfigSectionHandler.MyHandler config = (MyConfigSectionHandler.MyHandler)System.Configuration.ConfigurationManager.GetSection( "myCustomGroup/myCustomSection"); StringBuilder sb = new StringBuilder(); sb.Append("<h2>Attributes in the myCustomSection Element:</h2>"); sb.AppendFormat("myAttrib1 = {0}<br/>", config.MyAttrib1.ToString()); sb.Append("<h2>Attributes in the myChildSection Element:</h2>"); sb.AppendFormat("myChildAttrib1 = {0}<br/>", config.MyChildSection.MyChildAttribute1.ToString()); sb.AppendFormat("myChildAttrib2 = {0}<br/>", config.MyChildSection.MyChildAttribute2.ToString()); Label1.Text = sb.ToString(); Label1.Visible = true; } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>Untitled Page</title> </head> <body> <form id="form1" > <div> <h1>Enumerate MyCustomSection</h1> <asp:Label ID="Label1" Text="" /> <br /> <asp:Button ID="Button1" Text="Get Custom Config Info" OnClick="Button1_Click" /> </div> </form> </body> </html>
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script > Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim config As New MyConfigSectionHandler.MyHandler config = _ System.Configuration.ConfigurationManager.GetSection("myCustomGroup/myCustomSection") Dim sb As New StringBuilder sb.Append("<h2>Attributes in the myCustomSection Element:</h2>") sb.AppendFormat("myAttrib1 = {0}<br/>", config.MyAttrib1.ToString()) sb.Append("<h2>Attributes in the myChildSection Element:</h2>") sb.AppendFormat("myChildAttrib1 = {0}<br/>", config.MyChildSection.MyChildAttribute1.ToString()) sb.AppendFormat("myChildAttrib2 = {0}<br/>", config.MyChildSection.MyChildAttribute2.ToString()) Label1.Text = sb.ToString() Label1.Visible = True End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>Untitled Page</title> </head> <body> <form id="form1" > <div> <h1>Enumerate MyCustomSection</h1> <asp:Label ID="Label1" Text=""/> <br /> <asp:Button ID="Button1" Text="Get Custom Config Info" OnClick="Button1_Click" /> </div> </form> </body> </html>
Consulte também
Conceitos
ASP.NET Configuration File Structure (Sections and Section Handlers)
Visão Geral da Configuração ASP.NET