[ASP.NET] Web.Config ile kalıtım hakkında bilmeniz gereken 10 şey

Her bir web.config dosyası bulunduğu klasöre ve alt klasörlerine etki eder. Alt klasörde oluşturulan bir web.config dosyası üst klasördeki web.config dosyasındaki ayarları ezer veya değiştirir. Web.config dosyasında isteğe bağlı olarak alt klasörler için ayarlar yapılabilir.

ASP.NET ayarlar hiyerarşisinin ilk dosyası

systemroot\Microsoft.NET\Framework\versionNumber\CONFIG\Web.config dosya yolunda, tüm ASP.NET uygulamaları için geçerli ayarları default olarak içerir. Uygulamalarımızda eklediğimiz web.config dosyaları bu web.config dosyasından miras alır ve eklenen ayarları ezer.

Bir çok site için tek bir web.config dosyası yeterlidir.  Web.config ile kalıtım hakkında öğrenecekleriniz size çok yardımcı olacaktır.

Madde 1 : Alt klasörlerde Web.Config kullanımı

   Asp.NET website’ın web.config dosyası miras zincirinin bir parçasıdır. Projenizin alt klasörlerinde de o klasör ve alt klasörlerini etkileyecek ayarlar içeren bir web.config ekleyebilirsiniz.

Bu size genel ayarları ihtiyacınız olduğunda ezmenizi ve o klasör için farklı çalışmanızı sağlayacaktır. Alt klasörler tarafından ezilmeyen bir web.config dosyasının etkisi hala geçerli olacaktır. Bu yüzden alt klasörlerdeki web.config’ler olabildiğince küçük olacaktır. Web.Config’lerin bu şekilde kullanımının en güzel örneği klasörlere erişim yetkisidir. Böylece bir klasörün altındakilere erişim public iken başka bir klasördekilere erişim sadece yetkili kişilere açılabilir.

Madde 2 : Web.Config ayarlarını nasıl miras alır ?

   Web.Config’lerin miras zinciri aşağıdaki gibidir :

Configuration Level File Name File Description
Server Machine.config Server’daki tüm Web uygulamaları için ASP.NET şemasını içerir. Bu dosya ayar hiyerarşisinin ilk parçasıdır.
IIS ApplicationHost.config IIS 7.0 ayar sisteminin ilk dosyasıdır. Web server ayarları için tüm sitelerin tanımlarını,uygulamaları,sanal klasörleri, uygulama havuzlarını, global varsayılan değerleri içerir. Bu dosya yolunda bulunur.%windir%\system32\inetsrv\config
Root Web Web.config Bu dosya Machine.config dosyası ile aynı klasörde yer alır ve system.web ayar bölümleri için varsayılan ayarları içerir. Çalışma zamanında ayar hiyerarşisinin ikinci adımı olarak birleştirilir.
Web site Web.config Web sitelerine ve altında bulunan uygulama ve alt klasörlerine uygulanacak genel ayarları içerir.
Root klasördeki ASP.NET uygulaması Web.config Bulunduğu web sitesinde root klasöründe bulunur ve uygulama ayarlarını içerir ve ayarlarını alt klasör ve uygulamalara miras bırakır.
ASP.NET uygulamasının alt klasörleri Web.config Bulunduğu alt klasör ve o klasörün de alt klasörlerini etkileyecek ayarları içerir.

Bu yapı sayesinde website’niz server seviyesinde bulunan ayarları miras alır. Bunun sağladığı faydalar :

  • ASP.NET / IIS  takımında yapılan geliştirmelerin ayarlarının birleştirilmesi otomatik olarak yapılır ve uygulamanızın web.config dosyasında bir değişiklik yapmak zorunda kalmazsınız. Web.config dosyası daha ufak ve daha okunur olur. Örneğin, ASP.NET 4 ile birlikte bir kaç handler tanımını Machine.config dosyasına taşıdı. Böylece boş bir ASP.NET uygulamasındakii web.config dosyası 8 satır küçüldü.
  • İhtiyaç olduğunda ayarlarınızı server seviyesinde ezebilirsiniz. Böylece tüm uygulamalarınız bu değişiklikten etkilenebilecektir. Örneğin, <deployment retail=”true”>  ayarı ile çalışan bir serverdaki tüm trace çıktılarını ve debug yeteneklerini  kapatabilirsiniz.
  • Machine.config ayar dosyasını inceleyerek bir çok faydalı bilgiye ulaşabilirsiniz. Örneğin, ASP.NET Membership Provider’ın default olarak kullandığı şifre gereksinimleri ve database bilgilerine ulaşabilirsiniz. Default olarak yüklenmiş bir ASP.NET 4 için ayar dosyasını bu(

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config) dosyada bulabilir ve hızlı arama ile <membership>  yazıp inceleyebilirsiniz.

<membership>

        <providers>

          <add name=”AspNetSqlMembershipProvider” type=”System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” connectionStringName=”LocalSqlServer” enablePasswordRetrieval=”false” enablePasswordReset=”true” requiresQuestionAndAnswer=”true” applicationName=”/” requiresUniqueEmail=”false” passwordFormat=”Hashed” maxInvalidPasswordAttempts=”5” minRequiredPasswordLength=”7” minRequiredNonalphanumericCharacters=”1” passwordAttemptWindow=”10” passwordStrengthRegularExpression=””/>

        </providers>

</membership>

Madde 3 : Web.config ISS ayarlarını nasıl miras alır ?

   CarlosAg IIS 7 nin yeni konfigürasyon sistemi’ni anlattığı makale 2006’da yayınlandı. Bu makalede aşağıdaki şekilde web.config’in nasıl beslendiğin anlatan bir şema var. Bu makaleye göre web.config machine.config ile applicationHost.config  dosyalarından birlikte beslenmektedir. Makaleye buradan ulaşabilirsiniz.

Bu makaleyi ve yapıyı anlamak gerçekten önemli çünkü böylece hangi config dosyası hangi ayarları içerir, ayarlarda değişiklik yaparken neleri değiştiriyoruz, bu bilgileri bilmek sizi bir sonraki seviyeye çıkaracaktır. Örneğin, Web.config’deki URL Rewrite modülü konfigürasyonu.

Tabi ki server adminleri gerekli olmadığı durumlarda uygulamanın ayarlarının Web.Config aracılığı ile değiştirilmesini istemeyeceklerdir.  Bu nedenle ApplicationHost.config dosyasında uygulamalar ayarları ezebilir durumunu ayarlayabileceğimiz  koşullar vardır. Administration.config dosyası iis’e modül tanımları yapabilir ve bazı şeyleri modülmüş gibi kontrol edebilirsiniz.

Ayrıca ApplicationPool’ların hızlandırılması için bir geliştirme yapıldı ve her bir app pool için aspnet.config tanımı yapılabilir hale geldi. ASP.NET geliştiricilerin bilmesi gereken bir şey olmamak ile birlikte

maxConcurrentRequestsPerCPU,maxConcurrentThreadsPerCPU ve requestQueueLimit gibi ayarların application pool seviyesinde ayarlanabileceğini bilmek iyidir 🙂 Bu makaleye buradan ulaşabilirsiniz.

Madde 4 : Location

   Alt klasörlere parçalanmış web.configlerin kullanılması güzel olmak ile birlikte çok geniş projelerde yönetiminin zor olmasından dolayı <location> öğesi ile birlikte o dosya yoluna özel ayar yapılabilir. Örneğin dosya yüklemelerinin yapıldığı klasör’ün timeOut süresinin uygulamanın timeOut süresinden uzun olmasını isteyebilirsiniz. Aşağıdaki ayar ile bu klasöre özel timeOut süresi oluşturabilirsiniz.

<locationpath=”Upload”>
<system.web><httpRuntimeexecutionTimeout=”110″
maxRequestLength=”20000″ />
</system.web>
</location>

Madde 5 : Üst klasörlere ait ayarların temizlenmesi

   Bazen miras alınan tüm ayarların kaldırılmasını ve temiz bir başlangıç yapılmasını isteyebilirsiniz. Bu özelliği genellikle handler,module,connection string ve provider tanımlanırının yapıldığı yerlerde kullanabilirsiniz. Örneğin Scott Guthrie’nin bloğunda da anlattığı gibi kendi membership provider’ının yarattığı problemin sebebi, iki tane tanımlanmış provider, varsayılan ve özel tanımlanmış provider kullanılması. Config’deki dizileri yeni bir provider ekler iken  <clear/> özelliği ile temizlemek çok önemli bir konudur.

<membership>
<providers>
<clear/>
<addname=”AspNetSqlMembershipProvider”
type=”System.Web.Security.SqlMembershipProvider,
System.Web, Version=2.0.0.0,
Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a”
connectionStringName=”MyDatabase”
enablePasswordRetrieval=”false”
(
additionalelementsremovedforbrevity)
/>

</providers>
</membership>

Madde 6 : allowOverride ve inheritInChildApplications ile ayarların kilitlenmesi

   Alt uygulamaların veya alt klasörlerin ayarları miras alması engellenebilir. Bu özelliği allowOverride özelliği ile yapabilirsiniz.  MSDN’de bu özellik güzel bir şekilde anlatılmıştır :

“You can lock configuration settings in ASP.NET configuration files (Web.config files) by adding an allowOverride attribute to a location element and setting the allowOverride attribute to false. Then within the location element, you can define the configuration section that you want to lock. ASP.NET will throw an exception if another configuration file attempts to override any configuration section that is defined within this locked location element.

Using a location element with an allowOverride=false attribute locks the entire configuration section. You can also lock individual configuration elements and attributes using lockItem, lockElements, lockAttributes, lockAllAttributesExcept, and lockAllElementsExcept.”

Bu anlatımda demek istediği :

” Ayarları ASP.NET ayar dosyalarında location öğesine allowOverride niteliğini false yaparak kilitleyebilirsiniz.ASP.NET, eğer kilitlenmiş bir öğeyi başka bir ayar dosyası miras almaya çalışırsa hata fırlatacaktır.

Location öğesi ile birlikte allowOverride=false niteliği kullanılırsa tüm ayar bloğunu kilitleyecektir. Ayrıca

Özel ayar öğeleri ve nitelikleri lockItem,lockElements,lockAttributes,lockAttributesExcept ve lockAllElementExcept kilitleyebilirsiniz.”

Madde 7 : Alt uygulama ve klasörleri mirastan yoksun bırakma (inheritInChildApplications=”false”)

   Eğer bir ayarı sadece ana uygulama kullanmalı, alt uygulama ve klasörler miras alamamalı ise inheritInChildApplications niteliğini kullanarak miras almalarını engelleyebilirsiniz. Böylelikle ayarlarınız webconfig’in bulunduğu seviyede etkili olur, alt uygulama ve klasörlerde bu ayar miras alınamaz ve clear kullanmanıza da gerek kalmaz.

Örneğin bu linkteki sorunun çözümü bu şekilde çözülmüştür.

Bu konuya örnek olarak bu link de verilebilir.

Ayrıca burayı da inceleyebilirsiniz.

Madde 8 : Ayarları farklı dosyalarda kullanmak için configSource kullanın

   Web.config’deki bir ayar bloğunu configSource niteliğini kullanarak referans verilmiş farklı dosyalara taşıyabilirsiniz. Bu özelliği connection string’leri yönetmek için kullandım.

Örneğin :

<configuration>
<connectionStrings configSource=
“ConfigurationFiles\ConnectionStrings.xml” />

Bundan sonra yapmanız gereken sadece ConfigurationFiles klasörü altındaki ConnectionString.xml dosyasını ortamlara göre değiştirebilirsiniz. Referans verdiğiniz config’in değerlerini tutar ve söyle görünür :

<connectionStrings>
<addname=”subtextData”
connectionString=”Server=.;Database=staging;Trusted_Connection=True;” />
</connectionStrings>

Bu sorunu çözmenin başka bir yolu ise her bir ortam için ayrı bir config dosyası oluşturmak(dev.xml,production.xml) ve bunu kodlama esnasında kontrol etmektir. Ancak bu yöntemin dez avantajı ise bir değişiklik yaptığınızda tüm ortamlarda güncelleme yapılması gerekmektedir.

Bu sorunun daha iyi bir çözümü de Web.Config File Transformations’dır.

 

Madde 9 : Çevresel farkları yönetmek için Web.Config’in Transforms niteliğini kullan

 

Her ASP.NET projesi oluşturulurken web.config dosyası da oluşturulur ve oluşturulurken de debug ve release modlarını da web.config’i genişleterek görebilirsiniz.

web.config dosyanız asıl ayar dosyanızdır ve ne zaman build etseniz, ayarlarınızı debug veya release moda kendiliğinden dönüştürür. Eğer varsayılan olarak kullandığınız bir test database’iniz var ise release modda build ettiğinizde production’daki database’in config’inin çalışmasını istiyorsanız web.config’inizi aşağıdaki şekilde kullanabilirsiniz.

 

<connectionStrings>
<addname=”ApplicationServices”
connectionString=”[TestDatabase]” />
</connectionStrings>

 

Ve sonra Web.Release.config dosyanızı aşağıdaki şekilde değiştirin :

 

<?xml version=”1.0″?>
<configurationxmlns:xdt=”http://schemas.microsoft.com/XML-Document-Transform”>
<connectionStrings>
<addname=”ApplicationServices”
connectionString=”[ProductionDatabase]”
xdt:Transform=”Replace” xdt:Locator=”Match(name)”/>
</connectionStrings>
</configuration>

 

Bu kullanım oldukça basittir ve xdt:Transform=”Replace” xdt:Locator=”Match(name)” satırı işin nasıl yapıldığını basitçe anlatmaktadır.İsmi aynı olan ayarı değiştir.

 

Diğer örneklerin aksine , bu örnek çalışma zamanında değil build aşamasında çalışır.

 

Bu özelliğin faydalarından bahsetmek gerekirse :

  • İstediğiniz kadar build zamanı çalışacak birbirinden farklı ayar yaratabilirsiniz. Development ve Production zamanı çalışacak ayarları farklılaştırmak çok daha kolay bir hal almaktadır.

 

Web.Config Transform ile ilgili aşağıdaki makalelere göz atabilirsiniz.

 

Madde 10 : Ayar değişikliklerinde uygulamanın yeniden başlatılmasının yönetilmesi

 

Yukarıda da bahsedildiği gibi ayar dosyalarını yönetmenin bir sürü yöntemi vardır. Bu nedenle ASP.NET site için gerekli ayarları belleğine alır. Sadece ayar hiyerarşisi değiştiğinde uygulama yeniden başlatılır. Bunu engellemenin bir yöntemi  restartOnExternalChanges  özelliğidir.

 

Bununla ilgili bir örneğe MSDN’den ulaşabilirsiniz.

 

 

Kaynak : http://weblogs.asp.net/jongalloway//10-things-asp-net-developers-should-know-about-web-config-inheritance-and-overrides

 

7 thoughts on “[ASP.NET] Web.Config ile kalıtım hakkında bilmeniz gereken 10 şey

  1. Serkan Şirin says:

    Mrb. Hocam yazı için tşk ederim. Ancak benim bir sorum var ne yazık ki cevabını nette arayarak bulamadım. Amacım şu, web config dosyası içinde sql server bağlantısı kuruyorum ancak bu bağlantıda server, database, kullanıcı ID ve pass bilgilerinin parametrik olmasını yapamıyorum. Çünkü bağlantı giren kişinin ayarlarına göre değişmesi gerekiyor. Bunu nasıl yapabilirim yardım ederseniz memnun olurum.

    • Merhaba,

      Web config ile bu istediğinizi yapamazsınız. Ancak aklıma 2 seçenek geliyor.
      1- Bunun için uygulama ilk açıldığında kullanıcıdan bağlanacağı database bilgilerini alabilir daha sonra uygulamada bu değerleri kaydederek database’e bağlantı sağlayabilirsiniz. Daha sonraki açılışlarda bu kaydettiğiniz değerleri okuyarak bağlantıları açabilirsiniz.
      2- WebConfig’de bütün bağlantıları tutarsınız. Kullanıcı ile bağlantıları ilişkilendirirsiniz. Gelen kullanıcının bağlanacağı ayarları alırsınız daha sonra bağlantıyı bu connectionstring ile sağlarsınız.

      Diğer bir seçenek ise WCF Data Services. Burada connectionstring tutmanıza gerek kalmaz. Bir servis ile çekmek istediğiniz dataları alabilirsiniz.

  2. bahadır says:

    Dostum öncelikle bu faydalı paylaşımın için teşekkür ederim çok işime yaradı. Konuyla alakalı olduğunu düşündüğüm ve yaklaşık 13 saattir bir türlü çözemediğim ve heralde çözemeyeceğim bir sorunum var bana yardımcı olacağını ümid ediyorum 🙂

    Şimdi benim adminler adında klasörüm var ve bunu sadece admin yetkisine sahip kişilerin erişimine açmışım,.
    Bu adminler klasörü altında her admine ait bir klasör var, ve o klasörler içinde o admine ait txt dosyası var. Bu üstteki adminler klasörü diğer yetki ve kullanıcılara kapalı buraya kadar herşey tamam, fakat bu adminler(üst klasör) altındaki klasörler içinde bulunan txt dosyaları tüm kullanıcılara açık

    Ben bu adminler altında bulunan klasör ve dosyalarıda nasıl sadece admin yetkisine açabilirim, bu mümkün mü ? inan artık çıldırmak üzereyim yardımcı olursan gerçekten çok sevinirim kardeş.

    // bunun altındaki klasör ve dosyalar yetkiye bakmıyor ??

    • web.config’de Adminler yoluna özel yetki oluşturup, sadece admin rollerine açık yapabilirsin 😉

      <location path="Adminler">
          <system.web>
              <authorization>
                  <allow roles="admin" />
                  <deny users="*" />
              </authorization>
          </system.web>
      </location>
      

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir