Freigeben über


Server.MapPath ve alakasız görünen hatalar

Server.MapPath metodu, ASP zamanından bu yana çokça kullandığımız bir metottur. Aslında yaptığı tek şey, kodun çalıştığı bulunduğu yolu “string” olarak vermekten ibarettir. Ancak pek çok yerde çok kullanışlı olabilmektedir. Örneğin verilerimizi Access tablolarında tuttuğumuz senaryolarda, mdb dosyasının yerini tespit etmek için sıkça kullanılmaktadır Server.MapPath. Bir diğer çokça rastladığımız senaryo da, uygulamamızla ilgili ayarları tuttuğumuz dosyanın yerini yine bu metotla almaktır.

Teorik olarak bu kadar basit bir metodun bir soruna neden olması zor görünüyor. Ancak son dönemde, çok alakasız görünen bazı problemlerin kaynağının bu metot olduğunu tespit edince bu blogu yazma ihtiyacı duydum.

SORUN 1:

ASP.NET uygulamasında zaman zaman “System.IO.DirectoryNotFoundException” şeklinde bir hata alınıyordu. Genelde IIS’i yeniden başlatarak sorun çözülüyordu. Ancak bazen birkaç defa yeniden başlatmak gerekiyordu.

SORUN 2:

Yine bir ASP.NET uygulamasında bazen, tüm sayfalarda "System.NullReferenceException" almaya başlıyorduk. Sorunu, uygulamayı yeniden başlatarak (örneğin web.config’de değişiklik yaparak) düzeltebiliyorduk.

ÇÖZÜM:

Her iki senaryoda da sorunu, global.asax içerisindeki Application_Start metodundaki “Server.MapPath”i kaldırarak giderdik. Ancak sorunun kaynağının bu olduğunu tespit etmek elbette buraya yazmak kadar kolay olmadı.

NEDEN:

Application_Start metodu, adından da anlaşılacağı üzere, ASP.NET uygulamasına ilk istek geldiğinde çalıştırılır. Burada uygulama bazında bazı parametrelerin tanımlanması da yapılacak en doğal iştir. Bu tanımlamalar arasında, yolunu Server.MapPath kullanarak tespit edeceğimiz dosyalar da bulunabilir. Nitekim her iki senaryoda da olan buydu: Bir dosyanın yolu bu metotla okunup bir değişkene atanıyordu. Zaman zaman çalışmayan ve sorun çıkaran şey ise yine tam olarak buydu. Şimdi senaryoyu daha detaylı inceleyelim:

  •  Application_Start "event"i uygulamaya gelen ilk istekle çalışır. Dolayısıyla, uygulama bir nedenle yeniden başlatıldığında, ilk gelen istek hangi sayfaya yapılmışsa , Application_Start'ı o sayfa çağırır.
  • Bir ASP.NET uygulamasında bazı alt klasörler ve bu klasörlerde bazı ASP.NET sayfaları bulunabilir (nitekim her iki senaryoda da durum buydu).
  • Uygulamaya ulaşan ilk istek her zaman ana klasördeki bir sayfa için olmayabilir. Alt klasörlerden birindeki bir sayfaya istekte bulunulabilir (nitekim her iki senaryoda da durum buydu).
  • Kabaca diyebiliriz ki, Application_Start metodu, onu çağıran kod parçasıyla çalışır. Yani, eğer onu tetikleyen istek bir alt klasörde çalışıyorsa "Server.MapPath(./)" metodu o klasörü döndürür.

 İşte her iki senaryoda da yaşanan durum tam olarak buydu. Bazen tesadüfen ilk istek, alt klasörlerden birindeki bir sayfaya geliyordu. Böyle olunca Server.MapPath olmayan bir yolu gösteriyordu. Uygulamanın bu yol bilgisiyle ne yaptığına bağlı olarak da bir takım sorunlara neden oluyordu.

Senaryo 1'de belirli bir klasör yolu bir "application" değişkenine atanıp daha sonra kullanılıyordu. Dolayısıyla bu yol hatalı olduğunda, kullanıldığı yerlerde yukarıda bahsettiğim hata alınıyordu.

Senaryo 2'de ise, belirli bir yerdeki bir konfigürasyon dosyası okunup, yine "application" değişkenlerine bazı değerler atanıyordu. Ancak bu dosya bazen bulunamıyor ve bu değişkenler tanımlanamıyordu. Böyle olunca da, yine uygulama yeniden başlatılana kadar bu değişkenlerin kullanıldığı tüm sayfalarda yukarda bahsettiğim hata alınıyordu.

SONUÇ:

Server.MapPath metodu çok kullanışlı bir metoddur, ama kullanırken bir o kadar da dikkatli olmak gerekmektedir. Bu metodun çağırılacağı yerlerin (fiziksel yol anlamında) nereler olacağını dikkatlice incelemek gerekir.

CENK ISCAN