‘Configuration system failed to initialize’ Hatası
Bugün karşılaştığım 'Configuration system failed to initialize' hatası basit ama bir o kadar da rahatsız...
Bilindiği üzere ASP.NET’te verileri saklama veya sayfalar arası taşıma işlemleri, Durum Yönetimi (State Management) adı altında sunulan seçenekler kullanılarak yapılır. Bu opsiyonlara bakarsak:
| Durum Yönetimine Genel Bakış |
|
-View State -Control State -Hidden Form Fields -Cookies -Query String -Application State -Session State |
Şimdi QueryString özelliğini beraber inceleyelim.
QueryString soyut olarak nedir?
Sayfalar arası veri taşıma yollarından en kolayı olan QueryString yöntemi, URL üzerindeki stringler ile verileri taşımaya yarar. İnternette gezerken bir çok sitenin url adresleri garip harf ve sembollerle dolduğu dikkatinizi çekmiştir. İşte bu karakterler sunucu tarafında adrese eklenip sayfayla birlikte hareket eden QueryString'dir. Yeni sayfada bu link alınıp içindeki veriler sayfaya yerleştirilir. Fazla değerli verilerin olmadığı anlarda tercih edilmesi gereken yöntemdir çünkü taşınan veriler kullanıcının direk gözü önündedir. QueryString'in kullanımı çok kolaydır. Diğer bir güzel yanı ise URL adresinin içinde bulunmasından dolayı, sayfanın yerimlerine kaydedilmesi durumunda kendisinin de saklanmasıdır. Böylece yerimine gidildiğinde, sayfa saklandığı haldeki şekliyle açılır.
QueryString somut olarak nedir?
Öncelikle verilmesi gereken örnek heralde bir QueryString'in ekran görüntüsüdür.
|
Buradaki linkte site adındaki ? işaretinden sonra gelen parametreler QueryString vasıtasıyla gelmiştir. Şimdi bu parametrelerin buraya nasıl eklendiğine bir bakalım.
2 dk. öncesi
Yeni açtığımız bir siteye iki adet aspx sayfası ekleyelim ve ilk sayfaya şu kodu yazalım:
protected void Page_Load(object sender, EventArgs e)
{
Response.Redirect("default2.aspx?isim=Serkan&soyisim=Yazicioglu");
}
Bu sayfa çalıştırıldığında default2.aspx sayfası yukarıdaki resimde görüldüğü gibi belirecektir. QueryString sayfalar arasında veri taşıdığı için Response.Redirect içinde yer alan URL adresine bu sayfadaki veriler eklenir. Daha sonra diğer sayfanın Page Event'leri çalıştırıldığında bu veriler işleme tabi tutulur. Anlaşıldığı üzere QueryString'de iki adet önemli sembol vardır. Birincisi '?' işaretidir. Bu sembol sayfanın url adresi ile QueryString verilerini birbirinden ayırır. Bu işaretten sonra ne yazarsak yazalım sayfanın bulunamaması gibi bir hata oluşmayacaktır. '&' sembolü ise taşınan verileri birbirinden ayırmaktadır. Birden fazla veri taşınması durumunda araya hep ampersand koyulmalıdır. Örnek vermek gerekirse sayfamızda 3 adet TextBox nesnesi oluşturalım ve Text özelliklerini dinamik olarak QueryString'e ekleyelim:
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("default2.aspx?isim=" + TextBox1.Text + "&soyisim=" + TextBox2.Text + "&id=" + TextBox3.Text);
}
Peki QueryString nereden türemektedir? Buna bakmak için ise 'GoToDefinition' yapalım:
public sealed class HttpRequest
{
...
public NameValueCollection QueryString { get; }
...
}
Görüldüğü üzere QueryString bir property'dir. HttpRequest sınıfı, request sırasında kullanıcının gönderdiği HTTP tipindeki verilere ASP.NET'in ulaşmasını sağlar. NameValueCollection sınıfı ise (System.Collections.Specialized isimalanı altındadır) string tipinden bir adet 'Key' ve bir adet 'Value' saklamaktadır.
QueryString'e diğer sayfadan ulaşmak için Request.QueryString yazılır. QueryString'in içerisindeki verilere ise indeks veya 'Key' değeri üzerinden şu yöntemler kullanılırarak ulaşılabilir:
//Key değeri üzerinden ulaşmak için
string str = Request.QueryString["Key"];
//veya
string str = Request.QueryString.Get("Key");
//Indeks üzerinden ulaşmak için:
string str = Request.QueryString[0];
//veya
string str = Request.QueryString.Get(0);
//Tüm verilere ulaşmak için ise for döngüsü kullanmalıyız. Çünkü QueryString'in
'Request.QueryString.Values' adlı bir property'si bulunmamaktadır.
for (int i = 0; i < Request.QueryString.Count; i++)
{
DropDownList1.Items.Add(Request.QueryString[i]);
}
QueryString'de 'Key' değerleri farklı olmak zorunda değildir. 'Key' değerlerinin aynı olacağı durumlarda şuna dikkat edilmelidir:
//default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
Response.Redirect("default2.aspx?1=bir&1=iki&1=üç");
}
//default2.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < Request.QueryString.Count; i++)
{
DropDownList1.Items.Add(Request.QueryString[i]);
}
}
Bu şekilde yazdığımız taktirde karşımıza şu sonuç çıkacaktır:
|
Burada aynı 'Key' değerine sahip veriler tek bir string olarak alınmıştır. Bu string değerlerini birbirinden ayırmak için GetValues metodu kullanılır:
//default2.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
//GetValues metodu parametre olarak 'Key' veya indeks almaktadır.
foreach (string str in Request.QueryString.GetValues("1"))
{
DropDownList1.Items.Add(str);
}
}
Böylelikle QueryString içerisindeki aynı 'Key' değerine sahip verileri birbirinden ayırmış oluruz:
|
Response.Redirect yerine Server.Transfer metodunu kullanmak
Server.Transfer metodu bilindiği üzere tarayıcının bir sayfaya yönlendirilmesi sırasında tarayıcıdaki URL adresinde bir değişiklik yapmaz. Dolayısıyla bu metodu kullanmak QueryString'in URL'de görünmemesini sağlar. Örnek vermek gerekirse 2 adet aspx sayfası açıp, ilkine bir button ikincisine ise bir Label nesnesi ekleyelim. Code-Behind tarafımız ise şöyle olsun:
//default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("default2.aspx?id=Transfer Metodu", true);
//Buradaki ikinci özellik ise bool bir değer alıp QueryString gibi diğer sayfaya
geçebilecek nesnelerinin gönderilip gönderilmeyeceğini belirtir.
}
//default2.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Request.QueryString.Get(0);
}
Default.aspx sayfamız çalıştırıldığında tarayıcıdaki görüntü ilk başta şöyledir:
|
Daha sonrasında Button1'e basıldığında ise 2. sayfamız tarayıcıya gelmektedir:
|
Görüldüğü üzere sayfa değişmesine rağmen URL adresi değişmemiş dolayısıyla da QueryString kullanıcıya gösterilmemiştir. Server.Transfer metodu ise kullanım açısından Redirect metodu ile aynıdır.
QueryString'e eklenemeyen karakerler
QueryString'e '#', '+', '&' gibi bazı semboller eklenirken hatalar olmaktadır. Bu hataları önlemek için Server.UrlEncode metodu kullanılmalıdır.
protected void Button1_Click(object sender, EventArgs e)
{
string encoded = Server.UrlEncode(TextBox1.Text);
Response.Redirect("default2.aspx?name=" + encoded);
}
Bu metod çalıştırıldığında karakterler QueryString vasıtasıyla taşınabilecektir. Bu özelliğin kötü yanı QueryString'i uzatmasıdır. Ayrıca bazı sorunlar da çıkarabilir. Örnek vermek gerekirse '&' karakterinden sonra '#' karakteri gelirse bazı güvenlik önlemlerinden dolayı (cross-site scripting attack gibi) ASP.NET hata verebilir.
URL boyutlarında sınır
Tarayıcılar URL adreslerinin çok şişmesini önlemek için belirli sınırlar koymuşlardır. Bu sınıra adres ve diğer karakterler de dahildir ve artan karakterler URL'e eklenmez. Tarayıcılar arasında en düşük sınıra sahip olanı Internet Explorer'dır ve maksimum 2047 bayt almaktadır. Dolayısıyla QueryString'lerimizi bu değere yaklaştırmamaya dikkat etmemiz gerekir.
An itibariyle bu makalemizin sonuna gelmiş bulunmaktayız. Artık QueryString nedir, ne değildir onu da öğrendiğimize göre rahat bir uyku çekebiliriz. Herkese iyi günler.
Bugün karşılaştığım 'Configuration system failed to initialize' hatası basit ama bir o kadar da rahatsız...
Web uygulamalarında bazı durumlarda sunucuya yapılan request süreleri çok fazla olabilir veya kullanıcıların...
ASP.NET AJAX ile gelen sorunlardan biri de UpdatePanel içerisinde bazı durumlarda ajax postback yerine full...
Durum Yönetimi ve Farkları | Serkan Yazıcıoğlu
[...] Detaylı bir Querystring yazısı için tıklayınız… [...]
Tem 20, 2009 @ 06:38