Compartilhar via


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

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

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

Administrando ites da Web do ASP.NET

Configurando aplicativos