zaman aşımı (timeout) değerlerini dikkate almıyor

ASP.NET web uygulamaları, klasik ASP uygulamalarından farklı olarak server üzerinde derlenerek çalıştırılırlar. Çok kabaca bahsetmek gerekirse web uygulamanıza bir istek geldiği zaman, uygulamayı geliştirmiş olduğunuz ortama göre ilgili derleyici (compiler) çalışır ve ASP.NET kodunuz derlenerek “Temporary ASP.NET Files” klasörüne atılırlar. Örneğin kodunuz C# ile yazıldıysa csc.exe, VB.NET ile yazıldıysa vbc.exe derleme işlemini gerçekleştir.

Derlenen kod, konfigürasyonunuza göre aşağıdaki iki mod’dan birisine göre derlenir:

1) Debug mode
2) Release mode

Debug mode, isminden de anlaşılacağı üzere uygulamanızı debug etmek, yani hata olması durumunda hata ayıklamak amacıyla kullanılır. Bu modu uygulamayı geliştirirken kullanmanız önerilmektedir.

Release mode ise, uygulamanızın “production” ortamında, yani gerçek ortamda çalışacağı zaman kullanılması gereken durumdur.

Bu farkın çok temel birkaç nedeni vardır. Özetlemek gerekirse,

1) Debug mode’da derlenen uygulamalar optimize edilmezler. Dolayısıyla daha yavaş çalışma ihtimali vardır.
2) Uygulamanız “batch” olarak derlenmezler, yani her sayfanız ayrı bir DLL olarak derlenir. Dolayısıyla sayfalar çağırıldıkları zaman farklı modüller ayrı ayrı yüklenmek durumundadırlar.
3) Debug mode’da derlenen uygulamaların bellek kullanımı daha fazladır.
4) Zaman aşımı değerleri (timeout) dikkate alınmazlar. Örneğin “script timeout” yani bir ASPX sayfasının çalışma süresi (default değeri 110 saniye), debug mode’da olduğu zaman dikkate alınmaz ve hiçbir zaman “timeout” hatası almaz. Bunun temel nedeni ASP.NET uygulamaları debug edilirken Internet Explorer gibi bir browser içinde çalışması ve debugging işleminin belirtilen timeout süresinden fazla olma ihtimalidir.

Burada üzerinde durmak istediğim zaman aşımı değeri. Zaman aşımı değerinin dikkate alınmaması, yani sayfanın asla “timeout”a düşmemesi kulağa iyi birşeymiş gibi geliyor olabilir. Ancak bu durum pek çok problemi beraberinde getirmektedir. Örneğin çok uzun süre çalışan sayfalar uygulamanın genel performansını etkileyecektir. Sayfanın hata vermeden çalışması uygulamanın problemlerini hasır altı edecektir. Timeout olmaması nedeniyle bazı lock problemleri oluşabilir ve uygulamanız deadlock’a girebilir ve uygulamanız tamamen yanıt alamaz duruma gelebilir. Dolayısıyla uygulamanızın sağlığı açısından timeout değeri önemlidir.

Bir ASP.NET uygulamasının debug mode’da çalışıp çalışmamasını web.config dosyasında, compilation parametresi içinde belirtiriz. Örneğin, aşağıdaki gibi bir parametre içeren web.config dosyası, ilgili uygulamanın derlenirken debug mode’da derlenmesi gerektiğini belirtir:

      <system.web>

            <compilation debug="true"/>

      </system.web>

Uygulamanızın release mode’da derlenmesini istediğiniz durumlarda, örneğin uygulamanızı gerçek ortama (production’a) taşırken bu değer “false” yaparsınız:

      <system.web>

            <compilation debug="false"/>

      </system.web>

Ancak görünen o ki, hiç de azımsanmayacak kadar çok ortamda uygulama gerçek ortama taşınırken bu değer true olarak kalmakta ve farkedilmeden uygulama debug mode’da derlenip çalışmaktadır. Bunun sonucunda pek çok performans problemi yaşanmaktadır.

.NET 2.0 ile birlikte, bu problemlerin bir kısmının önüne geçebilmek için yeni bir konfigürasyon parametresi getirilmiş durumda: Deployment

Bu parametre, machine.config içinde tanımlanır. Örneğin:

      <system.web>

            <deploymentretail="true"/>

      </system.web>

Bu parametre machine.config içinde yer almaz ve default değeri false’tur. Eğer true yapmak isterseniz eklemeniz gerekmektedir.

Eğer bu parametrenin retail özelliği true olarak ayarlanmışsa, https://msdn.microsoft.com/en-us/library/ms228298(VS.80).aspx makalesinde anlatıldığı üzere, geliştirme ortamında kullanılan bazı ASP.NET özelliklerini kapatır. Makalede anlatıldığı gibi bu özellikler şunlardır:

· Tracing

· Custom errors

· Debug özellikleri

Dolayısıyla uygulama geliştiricilerin kodu gerçek ortama taşıdıkları sırada web.config içinde debug özelliğini değiştirmeyi unutma ihtimallerine karşı sistem yöneticileri, machine.config dosyasında deployment parametresinin retail özelliğini true’ya çekerek debug özelliklerini “production” makinesinde kapatma yoluna gidebilirler.

Buraya kadar herşey çok güzel. Ancak gerçek hayatta herşey bu kadar güzel olmayabiliyor J

Makalede her ne kadar debug özelliklerinin kapatılacağı belirtilmiş olsa bile, gerçekte deployment parametresi, zaman aşımı (timeout) değerlerini etkilememektedir. Yani, machine.config içinde deployment retail, true olarak belirtilmiş olsa bile, web.config dosyasında debug özelliği true olarak belirtildiği takdirde, bu web.config dosyasının ait olduğu uygulama, release mode’da çalışacak ancak timeout değerleri dikkate alınmayacaktır. Hatta web.config dosyasında debug mode false olarak belirtilmiş ama sayfa bazında debug true olarak bırakılmışsa timeout değeri bu sayfa için dikkate alınmayacaktır.

Dolayısıyla, deployment parametresi custom error, tracing ve çoğu debug özelliklerini kapatmaktadır ancak zaman aşımı değerleri debug parametresinin kendisine bağlıdır. Uygulamanızı production ortamına taşırken web.config içinde ya da sayfa bazında debugging’in kapalı olmasına hala dikkat etmeniz gerekmektedir.

Referanslar:

deployment Element (ASP.NET Settings Schema)
https://msdn.microsoft.com/en-us/library/ms228298(VS.80).aspx

compilation Element (ASP.NET Settings Schema)
https://msdn.microsoft.com/en-us/library/s10awwz0(VS.80).aspx

--
AMB