Skapa egen konfigurationssektion i web.config
Förord
Denna artikel handlar om hur web.config kan expanderas med egna sektioner.
Vad är en sektion?
En sektion är en utökning av web.config som definieras med hjälp XML-taggar. Med hjälp av en sektion så kan web.config
byggas ut med egna konfigurationsinställningar för en applikation. Exempel på hur en sektion i web.config kan se ut:
Kod 1.
name=”myConnString1”
connectionString=”Data source=(local);Initail catalog=Northwind; user id=sa; password=;”/>
name=”myConnString2”
connectionString=”Data source=(local);Initail catalog=Northwind2; user id=sa; password=;”/>
För att få tag på en sektion i web.config så behövs en sektionshanterare (Section handler). En sektionshanterare har
som uppgift att läsa och hantera sektionens data som finns i web.config och lagra den i en behållare (tex egen
definierad klass) som sedan returneras.
Skapa en sektionshanterare
För att skapa en sektionshanterare så måste en klass skapas och implementera interfacet IConfigurationSectionHandler. IConfiguartionSectionHandler interfacet finns under namnrymden (namespace) System.Configuration.
IConfigurationSectionHandler:
public interface IConfigurationSectionHandler
{
public Object Create(Object parent, Object input, XmlNode node);
}
Create metoden i IConfigurationSectionHandler har tre argument, parent, input och node. Kodexemplet i denna artikel kommer inte använda sig av varken parent eller input argumentet så en förklaring på dessa utelämnas. Argumentet node kommer att innehålla datan för en sektion som finns i web.config. node argumentet är av typen XmlNode och ger en direkt åtkomst till en sektions XML-taggar. Här kommer ett exempel på en sektionshanterare som läser in datan för sektionen connnectionStrings (se Kod 1) och lagarar den i en NameValueCollection.
Kod 2.
using System;
using System.Xml;
using System.Configuration;
using System.Collections.Specialized;
namespace SectionHandler
{
public class ConnectionStringSectionHandler : IConfigurationSectionHandler
{
public object Create(object parent, object input, XmlNode node)
{
string connName = null;
string connValue = null;
NameValueCollection connectionStrings = new NameValueCollection();
//Gör en klon av noden. Detta för att inte ändra på konfigurationsdatan.
XmlNode nodeCloned = node.Clone();
XmlNodeList connStrings = nodeCloned.SelectNodes("add");
foreach( XmlNode add in connStrings)
{
XmlAttribute name = add.Attributes["name"] as XmlAttribute;
if( name == null || name.Value == string.Empty )
throw new ConfigurationException("The value of the name attribute of the element is empty.");
connName = name.Value;
XmlAttribute value = add.Attributes["connectionString"] as XmlAttribute;
if( value == null || value.Value == string.Empty )
throw new ConfigurationException("The value of the connectionString attribute of the element is empty.");
connValue = value.Value;
connectionStrings.Add(connName, connValue);
}
return connectionStrings;
}
}
}
Exemplet ovan itererar genom alla <add> element som finns i <connectionStrings> sektionen. För varje steg i iterationen hämtas värderna för name och connectionString attributen (dessa attribut finns definierade i <add> elementet). Attributens värden lagras i en NameValueCollection (connectionStrings). Värdet i name attributet blir NameValueCollection objektets nyckel och värdet som finns i connectionString attributet kommer att lagras som värdet till nyckeln. När datan är inläst så returneras NameValueCollection objektet.
Registrera sektionshanteraren i web.config.
För att kunna expandera web.config med en egen sektion så måste sektionshanteraren och sektionen läggas till i web.config under <configuration> elementet. Sektionshanteren måste registreras under <configSections> elementet, se kod 3.Kod 3.
type="SectionHandler.ConnectionStringSectionHandler,SectionHandler"/>
name="myConnString1"
connectionString="Data source=(local);Initail catalog=Northwind; user id=sa; password=;"/>
connectionString="Data source=(local);Initail catalog=Northwind2; user id=sa; password=;"/>
...
...
I <configSections> elementet läggs sektionshanteraren till med ett <section> element. <section> elementet har två attribut, name och type. name används för att ange namnet på sektionen och namnet på rotelementet för den sektion som innehåller datan. I kod 3, är name satt till connectionStrings och rotelementet som innehåller datan för sektionen måste ha samma namn. type används för att ange den sektionshanterare (namnrymnd.klassnamn, assembly) som hanterar sektionsdatan som är angiven i name attributet.
Hämta sektionsdata med sektionshanteraren.
För att hämta sektionsdata ur en sektion så används metoden GetConfig som finns i ConfigurationSettings klassen (ConfigurationSettings klassen finns under namnrymnden System.Configuration). GetConfig har ett argument, detta argument används för att tala om vilken sektion som ska hämtas, tex connectionString som används i artikelns exempel,
se kod 1.
ConfigurationSettings.GetConfig("connectionStrings");
GetConfig använder sig av reflection för att dynamiskt initiera sektionshantarere som är specifierad för den angivna sektionen och kör sedan sektionshanterarens Create metod. GetConfig ser även till att sektionen som innehåller sektionens data skickas in till Create metodens node argument. Sedan är det upp till sektionshanteraren att läsa av och hantera sektionens data, se kod 2.
Create metoden och GetConfig returnerar ett objekt av typen objekt. För att kunna komma åt egenskaper och metoder för det objekt som sektionshanteraren returnerar, så måste det returnerade objektet "castas" till rätt objekt. Koden i kod 2, använder sig av en NameValueCollection. För att komma åt dess metoder och properties så måste objektet "castas" om till NameValueCollection:
NameValueCollection settings = (NameValueCollection)ConfigurationSettings.GetConfig("connectionString")
Variabeln settings kommer att innehålla alla de connection-strängar som är specifierade under <connectionStrings> sektionen i web.config. För att hämta en connection-sträng ur settings så anges namnet för connection-strängen som ett namn-index till settings objektet:
string connString = settings["myConnString1"];
string connString2 = settings["myConnString2"];
Koden till exemplet i denna artikel kan hämtas hem här.
Microsoft Configuration Management Application Block
Microsoft Patterns & Practices har skapar ett Konfigurationsblock som kan användas för skapa egna konfigurationsfiler.
Information om Microsoft Configuration Management Application Block finns på denna adress:
ASP.Net 2.0
I ASP.Net 2.0 så kommer denna artikels <connectionString> sektion att ingå som en del av web.config för att lagra connectoion-strängar. För att komma åt en connection-sträng i ASP.Net 2.0 så används en ny egenskap i ConfigureationSettings som heter ConnectionStrings.
ConfigurationSettings.ConnectionString["myConnString"]
I ASP.Net 2.0 så kommer även connection-strängarna kunna krypteras. För er som vill förbereda er inför ASP.Net 2.0 så rekommenderar jag er att läsa min artikel om
0 Kommentarer