C# - Saját adat tárolása a web.config állományba

forráskód letöltése
ASP.NET-es webes alkalmazásaink konfigurációs beállításai a web.config állományban kapnak helyet. Lehetőségünk van azonban arra is, hogy saját, egyedi adatainkat itt tároljuk és a programunk futása során ezeket felhasználjuk. Így könnyedén megvalósítható programunk működéséhez szükséges egyedi konfigurációs értékek tárolása, kezelése. Mellékelt példában az MS SQL szerver egy-egy adatbázisának kapcsolódásához szükséges sztringeket fogjuk eltárolni. Mivel ezek gépenként más és más értéket vehetnek fel, így célszerű nem a programba fixen beépíteni, hanem egy külső konfigurációs állományba helyezni, melyet akár manuálisan is szerkeszthetünk.
A megvalósításhoz nyissuk meg a web.config állományt, melybe egy új szekciót kell felvennünk. Ehhez először is meg kell adnunk, hogy az új szekció milyen típusú adatot tárol és azt milyen osztály kezeli. Hozzunk létre egy configSections nevű bejegyzést, majd ezen belül egy sectionGroup-ban megadhatjuk, hogy melyik csoportba kerülnek az adataink. Itt a system.web már létező szekciót adjuk meg.
  <configSections>
    <sectionGroup name="system.web">
A következő lépésben megadhatjuk a szekciónk nevét egy section bejegyzésben, valamint annak típusát is. A típusnál nem csak annak az osztálynak a nevét kell megadnunk, mely kezeli majd az adatainkat, hanem további az osztályra jellemző értékeket is.
      <section name="sqlconn" type="System.Configuration.NameValueSectionHandler,System,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" />
    </sectionGroup>
  </configSections>
Meg kell tehát adnunk, hogy a választott osztály melyik assembly-ben van, annak melyik verziója legyen felhasználva az adatok olvasásakor, valamint a nyilvános kulcs értékét is fel kell tüntetnünk. Saját adataink tárolásához a NameValueSectionHandler osztályt kívánjuk felhasználni, mivel adataink key/value páros formájában kerülnek a web.config-ba. Ez az osztály a System assembly-ben kapott helyet, melynek nyilvános kulcsa b77a5c561934e089. Ez az érték a Windows könyvtárán belüli Assembly könyvtárban lévő elemek mellett olvasható, így ha másikra lenne szükségünk, akkor innen megtudhatjuk bármelyik assembly nyilvános kulcsának értékét.
Most már definiáltuk az új szekciónkat és annak minden szükséges jellemzőjét, így már létrehozhatjuk a tényleges adatainkat. Mivel a szekciónkat „sqlconn”-nak neveztük el, így a system.web-en belül nyissunk egy ilyen nevű szekciót. Itt az add bejegyzéssel felvehetünk a key/value listába egy-egy újabb elemet. Paraméterként a key és a value attribútumoknál adhatjuk meg a tárolni kívánt értékeket. A szekciónkban tetszőleges számú bejegyzést elhelyezhetünk.
  <system.web>
    <sqlconn>
      <add key="Northwind" value="Data Source=;Initial Catalog=northwind;User ID=sa;Password=;Trusted_Connection=yes" />
      <add key="Pubs" value="Data Source=;Initial Catalog=pubs;User ID=sa;Password=;Trusted_Connection=yes" />
    </sqlconn>
    ...
Ezzel a web.config állományunk szerkesztését be is fejeztük, nézzük most miként tudjuk programból elérni a tárolt adatainkat. Mivel a web.config nem más mint egy XML típusú állományt, így megtehetnénk azt is, hogy XML-ként kezelve kiolvassuk a szükséges adatokat. Persze létezik ennél egy egyszerűbb megoldás is, melyet a HttpContext osztály nyújt számunkra. Ezt a Context property-n keresztül érhetjük el. Van ennek egy GetConfig nevű függvénye, mely képes a web.config-ból olvasni. Paraméterként meg kell adnunk csupán azt a szekciót, melyet szeretnénk kiolvasni. Ez a mi esetünkben most a „system.web/sqlconn” lesz. Visszatérési értékként egy NameValueCollection osztályt kapunk, mely tartalmazni fogja key/value formában az összes megadott adatunkat. Ettől kezdve már igen egyszerűen kiolvashatjuk a szükséges értéket és felhasználhatjuk azt.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      Label1.Text = ((NameValueCollection)Context.GetConfig("system.web/sqlconn"))["Northwind"];
      SqlConnection connection = new SqlConnection(Label1.Text);
      connection.Open();
      Label2.Text = connection.State.ToString();
      connection.Close();
    }