Fırat Esmer

ANLATILAN SENİN HİKAYENDİR - KARL MARX

Runtime'da Web.Config Dosyasını Modifiye Etmek

Bu makaleyi yazmamın amacı hazırlanan projelerde web.config dosyasına istediğimiz zaman, istediğimiz şekilde müdahele edebilmenin yollarını paylaşmaktır. Peki neden böyle bir şeye başvuralım? Sebebi ise projenizin web.config dosyasını açmadan ister httpModule ekleyin, isterseniz de customErrors kesitinde değişiklikler yapın. Ama benim senaryom daha farklı ve güncel olacak.

Senaryo : Yapmakta olduğunuz web projesinde bir iletişim sayfası hazırladığınızı düşünün. Bu iletişim sayfasında da ziyaretçilerin size istek, öneri veya şikayet gibi mesajları e-posta ile iletebildiğini düşünün.  E-posta atılmasını sağlayacak olan bilgilerin de web.config'de tutulduğunu düşünün (hesap ismi, parola, port ve smtp gibi). Güvenli şifre kullanımı gereği yönetici parolasını her 10 günde bir değiştirmek istiyor. Paneliniz hazır kodlar sizi bekliyor.

İzlenecek Yol : Öncelikle şunu belirteyim, konuyu toplam 4 işlemde ve bu işlemleri 2 yoldan göstereceğim. Bu işlemler gösterme, güncelleme, ekleme ve silme. Yollar, XML ve Configuration başlığı altında olacak.

Bilinmesi Gerekenler :

  • Makaledeki örnek .NET Framework 3.5 ve Visual Studio 2010 ile hazırlandı,
  • Yazma izniniz olması lazım aksi takdirde web.config dosyasında yapılan değişiklikler sonrasında kaydetme işleminde hata alırsınız,
  • Gösterme ve güncelleme işlemlerinde değerler manuel, diğerlerinde ise dışarıdan verilecek değerlere göre yapılacaktır. Bu tamamen size kalmıştır. Makalenin en sonunda vereceğim örneği istediğiniz gibi şekillendirebilirsiniz,
  • Hiçbir validation, try-catch ve işlem sonrası bilgilendirme mesajı uygulanmamıştır. Amacım sadece gerekli olan kodu paylaşmak.

Web.config dosyamızdaki appSettings section'ı aşağıdaki gibidir.

 <appSettings>
    <add key="MailAddress" value="firatesmer@hotmail.com.tr" />
    <add key="MailPassword" value="merhaba" />
    <add key="MailPort" value="587" />
    <add key="MailSMTPAddress" value="smtp.live.com" />
    <add key="MailEnableSsl" value="true" />
</appSettings>

XML Yolu

Gösterme İşlemi

XmlDocument xmlDoc = new XmlDocument();

// Web.config dosyamızı yüklüyoruz.
xmlDoc.Load(HttpContext.Current.Server.MapPath("web.config"));

// Web.config dosyamızda, appSettings'in altındaki attribute'lere ulaşıp, hepsini bir list'e atıyoruz.
XmlNodeList nodeList = xmlDoc.SelectNodes("configuration/appSettings/add");

// List'imizin içerisinde dönüyoruz.
for (int i = 0; i < nodeList.Count; i++)
{
// key attribute'ünü alıyoruz.
XmlAttribute nodeKey = nodeList[i].Attributes["key"];
// value attribute'ünü alıyoruz.
XmlAttribute nodeValue = nodeList[i].Attributes["value"];

// Burası manuel olduğu için dışarıdan bir değer verdirmedim. Eğer döngümüzdeki mevcut key'in attribute'ü MailPassword ise girmesi için koşul koyuyoruz.
if (nodeKey.Value == "MailPassword")
{
// Ve formumuzda bulunan label'da key'i MailPassword olan ayarın value'sunu gösteriyoruz.
lbl_GuncelDeger.Text = nodeValue.Value;
}
}

Güncelleme İşlemi

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("web.config"));

XmlNodeList nodeList = xmlDoc.SelectNodes("configuration/appSettings/add");

for (int i = 0; i < nodeList.Count; i++)
{
XmlAttribute nodeKey = nodeList[i].Attributes["key"];
XmlAttribute nodeValue = nodeList[i].Attributes["value"];

if (nodeKey.Value == "MailPassword")
{
//key'i MailPassword olan ayarın value'suna dışarıdaki textbox'tan gelen değeri atıyoruz.
nodeValue.Value = txt_YeniDeger.Text.Trim();
}
}

// Son olarak üzerinde değişiklik yaptığımız web.config dosyasını kaydediyoruz. Bunu, üzerinde oynanan notepad'in kapatılmak istedindiğinde yapılan değişikliklerin kaydedilmesini sorması gibi düşünün. Zaten bu işlemi bitirdiğinizde Visual Studio size web.config dosyasında yapılan değişikliklerin kaydedilip kaydedilmemesi sorusunu size soracaktır.
xmlDoc.Save(Server.MapPath("web.config"));

Ekleme İşlemi

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(HttpContext.Current.Server.MapPath("web.config"));

// Burada yaptığımız işlem web.config dosyamızın appSettings kesitini (section) bir düğümde tutmak.
XmlNode xmlNode = xmlDoc.SelectSingleNode("/configuration/appSettings");

// Yukarıdaki düğümü aşağıda kullanmamızın sebebi, appSettings kesitine yeni bir ayar eklerken, diğer tüm ayarların silinmesinden dolayı, diğerlerini yukarıdaki node'da tuttuk ve yeni ayarımızı bu node ile birleştirip tekrar yazdırıyoruz.

// Yeni ayarımızın key ve value attribute'lerinin değerini dışarıdaki textbox'lardan alarak ekleme işlemini yapıyoruz. Fark ettiyseniz elementimizi bile yazıyoruz. Bu işlem ile elimizle yazmamız arasında hiçbir fark yoktur.
xmlNode.InnerXml = xmlNode.InnerXml + "<add key=\"" + txt_Key.Text.Trim() + "\" value=\"" + txt_Value.Text.Trim() + "\"/>";

// Son olarak web.config dosyamızı kaydediyoruz.
xmlDoc.Save(HttpContext.Current.Server.MapPath("web.config"));

Silme İşlemi

string sonuc = string.Empty;

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("web.config"));

// appSettings altındaki sadece silinecek olan ayarı alıyoruz. Yani key'i, textbox'tan gelecek olan değere eşit olanı.
XmlNodeList silinecekAyar = xmlDoc.SelectNodes("/configuration/appSettings/add[@key=\"" + txt_SilinecekAyar.Text.Trim() + "\"]");

// appSettings altındaki tüm ayarları alıyoruz.
XmlNodeList tumAyarlar = xmlDoc.SelectNodes("/configuration/appSettings/add");

foreach (XmlNode node in tumAyarlar)
{
if (node.Attributes["key"].Value != silinecekAyar.Item(0).Attributes["key"].Value)
{
// ayar list'i üzerinde tuttuğumuz value ile ayarlar içerisinde uyuşan bir ayar yoksa sonuc adlı string'imize ekliyoruz. 
sonuc += "<add key=\"" + node.Attributes["key"].Value + "\" value=\"" + node.Attributes["value"].Value + "\" />";
}
}

XmlNode yeniAyarlar = xmlDoc.SelectSingleNode("/configuration/appSettings");

// yeniAyarlar adlı node'un yoluna bakarsanız direkt olarak appSettings'i göreceksiniz. Bunun sebebi ise hatırlarsanız ekleme işleminde tüm ayarlarımız siliniyordu ve bunun önüne geçmek için ayarlarımızı bir yerde toplayıp tekrar yazdırıyorduk.
yeniAyarlar.InnerXml = sonuc;
xmlDoc.Save(HttpContext.Current.Server.MapPath("web.config"));

Configuration Yolu

Gösterme İşlemi

// Projemizde bulunan web.config dosyamıza erişim sağlamak için aşağıdaki tek satırlık kod yetiyor.
Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

//config nesnemiz üzerinden appSettings kesitine direkt olarak ulaşıp istediğimiz ayarın değerini alabiliyoruz. Bize de label'da göstermek kalıyor.
lbl_GuncelDeger.Text = config.AppSettings.Settings["MailPassword"].Value;

Güncelleme İşlemi  

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

// Gösterme işlemindeki gibi key'i MailPassword olan ayarımızın value'sunu direkt olarak dışarıdan gelen değer ile değiştiriyoruz.
config.AppSettings.Settings["MailPassword"].Value = txt_YeniDeger.Text.Trim();

// web.config dosyamızı kaydediyoruz.
config.Save();

Ekleme İşlemi  

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

// Add metodu ile yapmamız gereken tek şey key ve value'yu atamak.
config.AppSettings.Settings.Add(txt_Key.Text.Trim(), txt_Value.Text.Trim());
config.Save();

Silme İşlemi

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

// Silmek istediğimiz ayarın key'ini vermemiz yetiyor.
config.AppSettings.Settings.Remove(txt_SilinecekAyar.Text.Trim());
config.Save();

Uygulamalı bir halini görmek için buraya tıklayın.

Yorumlar (1) -

  • Recep

    12.8.2011 01:59:53 | Yanıtla

    Yaram merhem oldunuz.Emeğinize saglık

Yorum ekle

Loading