Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Einstellungssache - Applikationsdaten in web.config

Geschrieben von: Christian Holm
Kategorie: ASP.NET

This printed page brought to you by AlphaSierraPapa

In der XML-basierten web.config Datei lassen sich auf einfache und strukturierte Weise Informationen für Web Applikationen oder Web Services speichern. Dieser Artikel beschreibt zwei Möglichkeiten, wie man für einen Web Service diverse Einstellungen speichern kann, und auch wie man das Standardset der ASP.NET Configuration Settings mit eigenen Tags erweitern kann.

Der Artikel Web.Config 101 hat Ihnen die Grundlagen zur Organisation bzw. Strukturierung, sowie die einzelnen Sections der web.config vermittelt. Heute wollen wir einen Schritt weiter gehen und Einstellungen eines einfachen Web Service konfigurieren. Hierfür habe ich zwei Beispiele erstellt, die einen - je nach Anforderung - unterschiedlichen Ansatz verwenden.

Aufgabenstellung

Es ist ein Web Service zu erstellen, der aus einer Datenbank (Northwind) anhand eines Querystrings ein XML formatiertes DataSet zurückliefert. Die Parameter des Connection-Strings sollen dabei in der web.config abgelegt werden. Da im Connection-String meist Parameter wie User ID und Paßwort vorkommen, sollen diese vor unerlaubtem Zugriff geschützt werden. Hierfür ist die web.config hervorragend geeignet, da .config Dateien vom IIS geschützt werden und somit diese von außen nicht angreifbar sind.

Kurz gesagt, die sicherheitssensitiven Informationen bleiben vom Client verborgen. Punkt.

Beginnen wir mit der einfachsten Möglichkeit einen Web Service mittels web.config zu konfigurieren. Beim ersten Beispiel verwenden wir die standardmäßig verfügbaren Section Handler (<appSettings>). Die Definition dieses Handlers ist bereits in der machine.config vorgenommen worden.

Die appSettings Sektion

In der appSettings Sektion können schnell und einfach Werte eingetragen werden. Um die Settings aus dieser Section zu erhalten, ist nur wenig Code erforderlich. Diese Section ist zwar leicht zu erreichen , aber sie läßt auch keine Neudefinierung des Namens zu. Bei komplexern, bzw. umfangreichern Applikationskonfigurationen kann sich dies als Nachteil erweisen.

Aber nun zum ersten Beispiel. Für den oben genannten Fall ist folgendes in der web.config einzutragen:

<configuration>
        <appSettings>
            <add key="NorthwindConn" value="server=(local);database=northwind;Trusted_Connection=yes" />
        </appSettings>
</configuration>

Um den Connection-String in der web.config anzugeben, müssen sie einfach innerhalb der <appSettings> Sektion ein neues add-Element erzeugen, und den Connection-String dann im value Attribut eintragen. Das key-Attribut wird für die eindeutige Zuweisung benötigt. Typdefinition des Section Handlers ist hier nicht notwendig da, wie schon erwähnt dies in der machine.config erfolgt ist. Das wär's zunächst für die Konfiguration unseres einfachen Web Service.

Was noch fehlt ist der eigentliche Web Service (DataSrv.asmx), welcher als Ergebnis das XML formatierte DataSet zurückliefert. Um dies zu realisieren, müssen wir natürlich zuerst den Connection String einlesen:

<%@ WebService Language="C#" Class="SimpleDataService" %>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;
using System.Configuration;

public class SimpleDataService 
{
    [WebMethod]
    public DataSet GetProductData() 
    {          		
        string strNorthwindConn = ConfigurationSettings.AppSettings["NorthwindConn"];
        SqlConnection MyConnection = new SqlConnection(strNorthwindConn);
       	SqlDataAdapter MySqlCommand = new SqlDataAdapter ("SELECT ProductName,UnitPrice,
            UnitsInStock FROM Products", MyConnection);
	  	
      	DataSet MyDataSet = new DataSet();
       	MySqlCommand.Fill(MyDataSet, "Products");
        return MyDataSet;
    }
}

Da dieses Beispiel einfach gehalten ist, besitzt dieser Web Service auch nur eine Web Method (GetProductData), die von außen zugänglich ist. Diese Methode hat als Rückgabewert ein DataSet.

Um die Einstellung aus appSettings verwenden zu können, müssen wir zunächst auf den System.Configuration Namspace referenzieren. Dann lesen wir den Wert der Property ein (ConfigurationSettings.AppSettings) und weisen den Wert der String-Variable strNorthwindConn zu. Den Inhalt dieser verwenden wir dann um die Verbindung zur Northwind SQL Datenbank aufzubauen.

Nach Instanzierung eines neuen DataSet Objektes und dessen Befüllung geben wir die XML formatierten Datensätze zurück. Da hier kein Consumer vorhanden ist, der den Web Service konsumiert, erhalten wir nach Ausführung der Web Method GetProductData die Rohdaten als XML. In diesem strukturierten, offenen Standard kann man die Daten einfachst jeder Client Applikation, die XML verarbeiten kann, übergeben.

Die beschriebene Möglichkeit des Auslesens der Applikationseinstellungen funktioniert aber nur, wenn Sie die Keys samt Values in die vordefinierte <appSettings> Sektion eintragen. Was aber, wenn Sie bei komplexeren Anwendungen oder speziell in diesem Fall eines Web Services, eigenes definierte Gruppen bzw. Section Handler in der web.config angeben wollen?

Benutzerdefinierte Section Handler

Um auf eigens definierte Sektionsgruppen bzw. Section Handler zugreifen zu können, müssen Sie u.a. die SingleTagSectionHandler Klasse und die NameValueSectionHandler Klasse des .NET Frameworks verwenden. Wie dies zu machen ist, zeigt das zweite Beispiel. Zunächst definieren wir in der web.config eine neue Section Group (Sektionsgruppe) und neue Section Handler (Sektionen) innerhalb des <configSections> Container-Tags:

<configuration>
  <configSections>
   <sectionGroup name="SimpleDataService">
      <section name="DataAccessConnString" type="System.Configuration.NameValueSectionHandler,System" />
      <section name="DataAccessQuery" type="System.Configuration.NameValueSectionHandler,System" />
   </sectionGroup>
  </configSections>

Wie Sie sehen können, können Sie somit einfach das Standardset der ASP.NET Konfigurationseinstellungen mit Ihren eigenen Tags erweitern. Die Tags müssen lediglich dem Typ eines Configuration Section Handlers entsprechen. Damit kann der Section Handler der NameValueSectionHandler Klasse den Tag interpretieren und abarbeiten. Vorteilhaft ist hier auch, daß Sie dadurch beim Configuration Object, welches Sie in weiterer Folge als Ergebnis erhalten, nicht an einen speziellen Datentyp gebunden sind.

Nachdem die neue Section Group SimpleDataService und die beiden Section Handler DataAccessConnString (für Connection String) und DataAccessQuery (für Query String) definiert bzw. die Typen angegeben wurden, können wir den Handlern Keys und Werte zuweisen:

   <SimpleDataService>
        <DataAccessConnString>
            <add key="Northwind" value="server=(local);database=northwind;Trusted_Connection=yes" />
        </DataAccessConnString>
	<DataAccessQuery>
            <add key="NorthwindQuery" value="SELECT ProductName,UnitPrice,UnitsInStock FROM Products" />
        </DataAccessQuery>
    </SimpleDataService>
</configuration>

Interessant ist nun, wie man innerhalb des Web Services (DataSrvAdv.asmx) die Werte ausliest:

<%@ WebService Language="C#" Class="SimpleDataService" %>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;
using System.Configuration;
using System.Collections.Specialized;

public class SimpleDataService 
{
    [WebMethod]
    public DataSet GetNWProductData()    
    {       
        NameValueCollection ConStringSection = (NameValueCollection)ConfigurationSettings
            .GetConfig("SimpleDataService/DataAccessConnString");
        NameValueCollection QuerySection = (NameValueCollection)ConfigurationSettings
            .GetConfig("SimpleDataService/DataAccessQuery");		
        string strNorthwindDSN = ConStringSection["Northwind"];
        string strNorthwindQuery = QuerySection["NorthwindQuery"]; 
        SqlConnection MyConnection = new SqlConnection(strNorthwindDSN);
        SqlDataAdapter MySqlCommand = new SqlDataAdapter (strNorthwindQuery, MyConnection);
	  	
      	DataSet MyDataSet = new DataSet();
       	MySqlCommand.Fill(MyDataSet, "Products");
        return MyDataSet;
    }
}

Da die Werte der benutzerdefinierten Section Handler Teil von Collections sind, müssen Sie zuerst auf den System.Collections.Specialized Namespace referenzieren. In der Web Method GetNWProductData verweisen Sie zuerst auf den jeweiligen Section Handler und können dann direkt den Wert daraus auslesen, da Sie den Key ja kennen. Nun müssen Sie nur noch die ausgelesenen Werte, die in einer Stringvariable (strNorthwindDSN bzw. strNorthwindQuery) gespeichert wurden dem SqlConnection und dem SqlDataAdapter Objekt übergeben - fertig.

Schlußbemerkung

Je nach Anforderung können Sie die Einstellungen Ihrer Web Applikation in der web.config ablegen. Entweder Sie begnügen sich mit dem standardmäßigen Section Handler, der Ihnen von Haus aus zur Verfügung gestellt wird, oder Sie erweitern die ASP.NET Configuration Settings durch Ihre eigenen Section Handler. Diese lassen sich, da XML basierend, auch leicht verschachteln und durch die Erfordernis der Eindeutigkeit korrekt anfordern. Weiters erweist sich als praktisch, daß die web.config von außen für den Client nicht angreifbar ist, und somit zur Speicherung sensitiver Daten geeignet ist.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20011122.zip

Verwandte Artikel

Datenbankzugriff mittels ADO.NET
http:/www.aspheute.com/artikel/20001102.htm
Formularbasierte Authentifizierung in fünf Minuten
http:/www.aspheute.com/artikel/20020705.htm
Index Server Abfragen per Web Service
http:/www.aspheute.com/artikel/20021107.htm
MS IE WebControls 101
http:/www.aspheute.com/artikel/20020801.htm
Web Services 101 in ASP.NET
http:/www.aspheute.com/artikel/20010621.htm
Web.Config 101
http:/www.aspheute.com/artikel/20010802.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.