Fırat Esmer

Microsoft Yazılımları

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.

Microsoft Türkiye Blog Yayında

Microsoft Türkiye BlogBugün Microsoft Türkiye sitesine haftalık ziyaretlerimden birini yaparken "Microsoft Türkiye Resmi Blogu Yayında" adlı habere gözüm takıldı. Haber ile ilgili daha fazla detay almak için habere tıkladığımda karşımda bir sürü renkle donatılmış bir site buldum. Sitenin içeriği ise Microsoft ürünleri hakkında bilgiler veren haberler ile dolu (Microsoft Office, Windows Live Messenger, MS SQL Server gibi). Sıradan bir site gibi göründü ancak sağ taraftaki kategorilerde "Yazılım Geliştiriciler" kısmını görünce işime yarabileceğini düşündüm. Şu an için boş olan yazılım kısmı umarım kısa zamanda doldurulur ve işimize yarabilecek bilgiler ediniriz. Blog yeni açıldığı için biraz sabretmemiz lazım.

Microsoft Türkiye Blog adresine ulaşmak için buraya tıklayın.

Internet Explorer Compatibility View Meta Tag'i

Bugün şirkette rutin bir şekilde proje ile ilgilenirken bir sayfada javascript ile listbox'lar oluşturup, item'ların click anında değerlerini yakalayıp sql sorgusu hazırlamam gerekiyordu. Bu işlemi, kendi bilgisayarımda olmadığım için ilk önce boş bir sayfada yaptım. Eksik olup olmadığını görmek için kontrolümü ettim ve projeme dahil ettim. Fakat o da ne? Bu sefer çalışmamıştı. Ama neden? Aklıma 2 tane sorun geldi. Bunlardan ilki ya masterpage ile ilgili bir sıkıntı vardı (bunu düşünmemin sebebi, sayfanın ana şablonunun masterpage'den gelmesiydi), ikincisi de projem ile ilgili bir sıkıntı vardı ki kulağa çok saçma geliyordu. Hemen yeni bir masterpage açıp, hazırlamış olduğum sayfası içerisine yerleştirdim ve bu sefer oldu. Gözlerim, Sauron'un yüzüğü aradığı gibi hatalı kısmı aramaya başladı. Fakat hiç absürd kısım göremedim. Ne kod tarafında ne de HTML tarafında derken gözüme daha önce hiç tanınmamış bir meta tag takıldı.

 <meta http-equiv="X-UA-Compatible" content="IE=IE7" />

İçimden "bu ne ya?" dediğimi hatırlıyorum. Araştırdım ve bu meta tag'in aslında yapılmış olan sayfanın Internet Explorer 7 formatında açılmasını belirttiğini öğrendim (Compatibility View ya da Uyumluluk Modu). Benim hiç ilgimi çekmedi çünkü "bana ne?" sitenin görselinden diyordum. Ta ki bu meta tag'i kaldırana kadar. Sorunum hallolmuştu. Peki neden? Hiçbir fikrim yoktu açıkçası. Belki de Internet Explorer 7, yazmış olduğum javascript'i algılamıyordu. Bu meta tag'i kimin eklediğini öğrenmek için iş arkadaşlarımı sorguya çektiğim zaman, şirketimizin grafikerlerinden George pek de sağlıklı cevaplar vermedi. :)

Bu resim meta tag'in ekli olduğu zamanki hali.

Compatibility View Yok

Bu resim ise meta tag'in ekli olmadığı zamanki hali.

Compatibility View Var

content="IE=IE7" yerine  content="IE=IE8" de diyebilirsiniz (Internet Explorer 8 için).IE5, IE7, IE8 ve IE9 için seçenekleriniz var. Hatta en son tarayıcı versiyonuna göre ayarlamak isterseniz content="IE=Edge" yazarsınız, tekrar tekrar değiştirmekten kurtulursunuz. İstediğiniz formatı belirleyin ve <head></head> tag'leri arasına yerleştirin.

Peki her sayfanın head tag'i arasına yazmasak da, onun yerine web.config dosyasında bu işlemi tanımlasak? O da oluyor. IIS ayar kısmını 8 adımda anlatan açıklamaya buradan ulaşabilirsiniz.

Genel olarak Internet Explorer Compatibility View hakkında daha fazla bilgi almak için de buraya tıklayın.

Internet Explorer 10 Platform Ön İzleme 1 Hazır

MIX 1112 Nisan'da ABD'nin Las Vegas eyaletinde yapılan Microsoft MIX 11 etkinliğinin belki de en büyük bombası Internet Explorer 10'un ilk platform ön izleme versiyonunun tanıtılmasıydı. Gündemi belirleyen maddeler yine CSS3 ve HTML5 olmuştu. CSS3 ile ilgili daha çok Gradients, Grid, Flexbox, Multi-column gibi maddeler vardı. Zaten Internet Explorer 10 Platform Preview'i indirdiğiniz zaman bir çok HTML5 ve CSS3 testini deneyip görebileceksiniz. Ek olarak ECMAScript 5 desteğini de gördüm.

Okuduğum habere göre daha çok Internet Explorer 9 üzerinden gidilecek olan Internet Explorer 10, Windows Vista'da çalışmayacak. Ayrıca Windows 7'de ise Service Pack 1 yüklü olması ve işletim sisteminizin orjinallik testinden geçmesi gerekecekmiş.

Internet Explorer 10 Platform Preview 1'i indirmek için buraya, geliştiriciler ise buraya tıklayın.

Internet Explorer Blog'u tarafından yayınlanan haberi okumak için buraya (bu linkte bulacağınız videoda bazı testleri izleyebileceksiniz), MIX 11 tarafından yayınlanan haberi okumak için de buraya tıklayın.

Microsoft Research Hakkında

Microsoft ResearchMicrosoft Research'ı çoğumuz muhtemelen duymuştur. Peki gerçekte nedir bu Microsoft Research? Microsoft Research, Microsoft'un Araştırma Geliştirme (AR-GE) birimidir. Dünyanın her köşesine yayılmış 10'dan fazla teknoloji laboratuvarı bulunuyor. Burada, gerek Microsoft ürünleri, gerekse bilimsel alanlarda araştırma ve geliştirme yapılıyor. Bugün kullandığımız çoğu programın teknoloji kısmını bu birim geliştiriyor.

Söz konusu teknoloji olunca, kesenin ağzını açmak gerekiyor. Bu nedenle Microsoft geçen sene AR-GE'ye 9,5 milyar dolar yatırdı.

11 Mart'ta Microsoft Türkiye Bilişim Zirvesi 2011'e gidenler eğer açılış videosundaki teknolojileri hatırlıyorlarsa şunu belirteyim ki, o teknolojilerin hepsi Microsoft Research'ün laboratuvarlarında geliştiriliyor. Üzerinde durdukları bir kaç ana konuyu belirteyim :

  • Algoritma ve teoriler,
  • İnsan - bilgisayar etkileşimi,
  • Güvenlik ve şifreleme,
  • Yazılım ve donanım geliştirme gibi.

Peki gündelik hayatta Microsoft Research'ün elinden çıkmış hangi ürünleri kullanıyoruz?

Kinect

Bildiğiniz gibi XBOX360'da hareket ve vücut hareketlerini algılamak için kullanılıyor.

Bing Translator

 30'a yakın dili çevirme ve sesli şekilde okumaya yarıyor.

Photosynth

Makine ile çektiğiniz resimleri sanal ortamda 3 boyutlu hale getirip, yüksek kalitede zoom yapabilmenizi sağlıyor.

Generics for .NET 

Evet, generic sınıflar da bu laboratuvarların bir ürünü.

WorldWide Telescope (Favorim)

WorldWide Telescope uzayın en uzak köşesini, tüm detaylarıyla birlikte ayağınıza getiriyor.  WorldWide Telescope'un bir de Mars eklentisi var ki Mars'ı noktasına kadar incelemenize izin veriyor.

Bunların yanında Surface, F#, Text-to-speech, IPV6 desteği, SmartScreen ve Kodu (ve yüzlercesi) gibi uygulamalar da aynı ellerden çıkma.

Microsoft Research hakkında daha fazla bilgi almak veya uygulamaları görüp indirmek istiyorsanız buraya tıklayın.