Como: Criar Custom configuração Sections usando IConfigurationSectionHandler
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 implemente tanto a interface System.Configuration.IConfigurationSectionHandler quanto a classe System.Configuration.ConfigurationSection.
Observação: |
---|
Este tópico usa a interface System.Configuration.IConfigurationSectionHandler, que foi substituída no .NET Framework versão 2.0.Para um exemplo que use a classe System.Configuration.ConfigurationSection. consulte Como: Criar usando ConfigurationSection Custom configuração Sections.Se você usar os seguintes exemplos de código, por favor, crie-os com o .NET Framework versão 1.0 ou 1.1. |
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 implemente a interface System.Configuration.IConfigurationSectionHandler, conforme ilustrado no código a seguir.
Imports System Imports System.Collections Imports System.Text Imports System.Configuration Imports System.Xml Namespace MyConfigSectionHandler Public Class MyHandler Implements IConfigurationSectionHandler Public Function Create( _ ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) _ As Object Implements System.Configuration.IConfigurationSectionHandler.Create Throw New System.Exception("The method is not implemented.") End Function End Class End Namespace
using System; using System.Collections.Generic; using System.Text; using System.Configuration; using System.Xml; namespace MyConfigSectionHandler { public class MyHandler : IConfigurationSectionHandler { #region IConfigurationSectionHandler Members object IConfigurationSectionHandler.Create( object parent, object configContext, XmlNode section) { throw new Exception("The method is not implemented."); } #endregion } }
Adicione seu próprio código para executar o trabalho de configuração que desejar.
Por exemplo, você pode substituir a linha throw new Exception("The method is not implemented."); por código que obtenha os nomes de atributos e valores a partir da propriedade Attributes do parâmetro section, e retorne um objeto de configuração personalizado.O exemplo a seguir usa uma Hashtable como objeto de configuração.
Imports System Imports System.Collections Imports System.Text Imports System.Configuration Imports System.Xml Namespace MyConfigSectionHandler Public Class MyHandler Implements IConfigurationSectionHandler Public Function Create( _ ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) _ As Object Implements System.Configuration.IConfigurationSectionHandler.Create ' Creates the configuration object that this method will return. ' This can be a custom configuration class. ' In this example, we use a System.Collections.Hashtable. Dim myConfigObject As New Hashtable ' Gets any attributes for this section element. Dim myAttribs As New Hashtable For Each attrib As XmlAttribute In section.Attributes If XmlNodeType.Attribute = attrib.NodeType Then myAttribs.Add(attrib.Name, attrib.Value) End If Next ' Puts the section name and attributes as the first config object item. myConfigObject.Add(section.Name, myAttribs) ' Gets the child element names and attributes. For Each child As XmlNode In section.ChildNodes If XmlNodeType.Element = child.NodeType Then Dim myChildAttribs As New Hashtable For Each childAttrib As XmlAttribute In child.Attributes If XmlNodeType.Attribute = childAttrib.NodeType Then myChildAttribs.Add(childAttrib.Name, childAttrib.Value) End If Next myConfigObject.Add(child.Name, myChildAttribs) End If Next Return (myConfigObject) End Function End Class End Namespace
using System; using System.Collections; using System.Text; using System.Configuration; using System.Xml; namespace MyConfigSectionHandler { public class MyHandler : IConfigurationSectionHandler { #region IConfigurationSectionHandler Members object IConfigurationSectionHandler.Create( object parent, object configContext, XmlNode section) { // Creates the configuration object that this method will return. // This can be a custom configuration class. // In this example, we use a System.Collections.Hashtable. Hashtable myConfigObject = new Hashtable(); // Gets any attributes for this section element. Hashtable myAttribs = new Hashtable(); foreach (XmlAttribute attrib in section.Attributes) { if (XmlNodeType.Attribute == attrib.NodeType) myAttribs.Add(attrib.Name, attrib.Value); } // Puts the section name and attributes as the first config object item. myConfigObject.Add(section.Name, myAttribs); // Gets the child element names and attributes. foreach (XmlNode child in section.ChildNodes) { if (XmlNodeType.Element == child.NodeType) { Hashtable myChildAttribs = new Hashtable(); foreach (XmlAttribute childAttrib in child.Attributes) { if (XmlNodeType.Attribute == childAttrib.NodeType) myChildAttribs.Add(childAttrib.Name, childAttrib.Value); } myConfigObject.Add(child.Name, myChildAttribs); } } return (myConfigObject); } #endregion } }
Para adicionar um manipulador de seção personalizado a um arquivo de configuração do ASP.NET
Adicione um elemento sectionGroup e section ao seu arquivo Web.config dentro do elemento configSections, conforme ilustrado no código a seguir.
Observação: Aninhar um elemento section em um sectionGroup é opcional, mas é recomendável para ajudar a organizar 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 ConfigurationManager.GetSection ou o método WebConfigurationManager.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 quando um botão é clicado.
Como o manipulador de seção personalizada usa um Hashtable como objeto de configuração, o método GetSection retorna um Hashtable.
O código a seguir aparece na página .aspx.O código para o evento de clique em botão, que aparece no arquivo code-behind, está contido no próximo exemplo de código.
Os exemplos de código a seguir requerem o .NET Framework versão 1.0 ou 1.1.
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="BugTest.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 2003"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name=vs_defaultClientScript content="JavaScript"> <meta name=vs_targetSchema content="https://schemas.microsoft.com/intellisense/ie5"> </head> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" > <h1>Enumerate MyCustomSection</h1> <asp:Label ID="Label1" Text="" /> <br /> <asp:Button ID="Button1" Text="Get Custom Config Info" OnClick="Button1_Click" /> </form> </body> </html>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 2003"> <meta name="CODE_LANGUAGE" Content="VB"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="https://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" > <h1>Enumerate MyCustomSection</h1> <asp:Label ID="Label1" Text="" /> <br> <asp:Button ID="Button1" Text="Get Custom Config Info" OnClick="Button1_Click" /> </form> </body> </HTML>
O seguinte código para o evento de clique em botão aparece no arquivo code-behind que pertence à página .aspx anterior.O arquivo code-behind usa a extensão de nome de arquivo .aspx.cs ou .aspx.vb, dependendo do atributo language da declaração @Page.
[C#]
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Configuration; using System.Text; namespace BugTest { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion protected void Button1_Click(object sender, System.EventArgs e) { Hashtable config = (Hashtable)System.Configuration.ConfigurationSettings.GetConfig("myCustomGroup/myCustomSection"); StringBuilder sb = new StringBuilder(); sb.AppendFormat("Config object item count = {0}<br/><br/>", config.Count); foreach (DictionaryEntry deKey in config) { sb.AppendFormat("<h2>Attributes in the {0} Element:</h2>", deKey.Key.ToString()); Hashtable attribs = (Hashtable)deKey.Value; foreach (DictionaryEntry deAttrib in attribs) { sb.AppendFormat("{0} = {1}<br/>", deAttrib.Key.ToString(), deAttrib.Value.ToString()); } } Label1.Text = sb.ToString(); Label1.Visible = true; } } }
Imports System.Text Public Class WebForm1 Inherits System.Web.UI.Page #Region " Web Form Designer Generated Code " 'This call is required by the Web Form Designer. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() End Sub Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents Button1 As System.Web.UI.WebControls.Button 'NOTE: The following placeholder declaration is required by ' the Web Form Designer. 'Do not delete or move it. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal _ e As System.EventArgs) Handles MyBase.Init 'CODEGEN: This method call is required by the Web Form Designer 'Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal _ e As System.EventArgs) Handles MyBase.Load 'Put user code to initialize the page here End Sub Protected Sub Button1_Click(ByVal sender As System.Object, ByVal _ e As System.EventArgs) Handles Button1.Click Dim config As Hashtable = _ System.Configuration.ConfigurationSettings.GetConfig( _ "myCustomGroup/myCustomSection") Dim sb As New StringBuilder sb.AppendFormat("Config object item count = {0}<br/><br/>", _ config.Count) For Each deKey As DictionaryEntry In config sb.AppendFormat("<h2>Attributes in the {0} Element:</h2>", _ deKey.Key.ToString()) Dim attribs As Hashtable = deKey.Value For Each deAttrib As DictionaryEntry In attribs sb.AppendFormat("{0} = {1}<br/>", deAttrib.Key.ToString(), _ deAttrib.Value.ToString()) Next Label1.Text = sb.ToString() Label1.Visible = True Next End Sub End Class
Consulte também
Tarefas
Como: Criar usando ConfigurationSection Custom configuração Sections
Conceitos
ASP.NET Configuration File Structure (Sections and Section Handlers)
Outros recursos
Administrando ites da Web do ASP.NET