ASP.NET Page Life Cycle (Sayfa Yaşam Döngüsü)

ASP.NET tabanlı site hazırlarken gerek sunucu ile istemci arasındaki işleyişi izlemek gerekse web tabanlı özel kontrol geliştirirken request-response sürecindeki yol haritasını, Asp.NET yaşam döngüsünü bilmek sürece olan hakimiyetimizi artıracaktır. Asp.NET’in sayfa yaşam döngüsünde her request işleminde page nesnesi ve içindeki kontroller yeniden oluşturulur ve işlem sonucunda yok edilir. Bu oluşma-yok olma sürecinde bazı evre ve olaylar gerçekleşir. Bu evre ve olaylar, sayfa ve sayfa içerisindeki kontrollerin yaşam döngüsüyle ilintilidir. Burada Asp.NET yaşam döngüsünü hatırlayacak kadar burada özetlememiz faydalı olacaktır. Aşağıdaki tabloda sayfa ve kontrol bazlı yaşanan evreler gösterilmiştir.

Aşama Açıklama
Page request Page life cycle başlamadan önce bu aşama çalışır. Sayfa bir kullanıcı tarafından istendiği zaman Asp.NET, bu sayfanın parse ve compile edilip edilmeyeceğine veya sayfayı çalıştırmadan varsa cachedeki versiyonunu gönderip göndermeyeceğine karar verir.
Start Yaşam döngüsünün ilk adımını temsil eden bu süreçte page nesnesinin Request ve Response gibi property’leri set edilir. Ayrıca page nesnesi, gönderilen requestin bir Postback sonucu mu yoksa yeni bir request olarak gelip gelmediğini belirler ve ona göre IsPostBack property’sini set eder. IsPostBack, sayfanın Postback modunu bildirir. Bu aşamada ek olarak sayfanın UICulture propertysi de set edilir.
Page initialization Sayfanın oluşturulma aşamasında sayfa üzerindeki kontroller, erişilebilir duruma gelir ve her kontrolün UniqueID propertysi set edilir. Eğer o anki request, bir Postback sonucu gerçekleşmişse bu aşamada Postback data henüz yüklenmemiş ve kontrollerin değeri Viewstate’e göre yenilenmemiştir.
Load Load aşamasında eğer geçerli request bir postback ise kontrollerin değeri ve durumu Viewstate içeriğine göre şekillenir.
Validation Varsa sayfa üzerindeki validator kontrollerin Validate() metodu çağrılır. Validate() metodu, page nesnesi ve içindeki kontrollerin her birinin IsValid property’sini set eder. Hatırlanacağı gibi IsValid property’si, kontrolün doğrulama işleminin başarılı olup olmadığını bildirir.
Postback event handling Eğer request bir Postback sonucu gerçekleşmişse, Postback’i gerçekleştirmiş veya durumu değişmiş kontrollerin ilgili eventleri tetiklenir.
Rendering Render işleminden önce page ve kontroller için Viewstate nesnesi kaydedilir. Render aşamasında page nesnesi, her kontrolün Render() metodunu çalıştırır. Render() metodu, text writer nesnesini kullanarak kontrolün outputunu page’in Response propertysine ait OutputStream‘e (HTTP ile gidecek olan binary içerik) yazar.
Unload Unload evresi, sayfa tümüyle render edildikten ve istemciye gönderildikten sonra çağrılır. Bu durumda sayfa, artık hafızan kaldırılmaya (discard) hazırdır. Unload aşamasında, Request ve Response nesneleri temizlenmiş olur.

Döngünün bu evrelerinde zamanı geldikçe ilgili event ve metodlar otomatik olarak tetiklenir. Bunları da şu şekilde özetleyebiliriz;
1.Page_PreInit

IsPostBack property’si okunup sayfanın ilk defa process edilip edilmediği öğrenilebilir. Dinamik kontrollerin oluşturulması, master page‘in programatik olarak uygulanması, theme propertysinin dinamik olarak set edilmesi bu metod içinde yapılır. Ayrıca bu metod içinde profile property’si okunabilir veya set edilebilir.

2.Page.Init + Control.Init

Döngünün ilk aşaması olan Initialization evresinde sayfaya ait control tree, tanımlı kontrollerle şekillenir ve önce page nesnesine ait Init eventi daha sonra her kontrolün ayrı Init eventi tetiklenir. Viewstate bilgisi henüz yüklenmemiştir.

3.Page.LoadViewState

Initialization aşamasından sonra ASP.NET, sayfanın Viewstate’ini yükler. Viewstate, sayfanın sunucuda en son process edilmiş durumunu içerir.

4. Page.ProcessPostData

Request ile birlikte gelmiş Postback data okunur ve ilgili kontrollere yüklenir

5. Page.Load + Control.Load

Sayfa üzerindeki kontroller, tümüyle yüklendikten sonra Load eventleri tetiklenir. Bu metoda, genellikle sayfa ilk defa çağrıldığı(Postback edilmediği) zaman yapılacak data binding işlemleri yazılır.

6. “Change” Events

Kontrollerin yeni değerleri(Postback) ile orijinal değerleri(Viewstate) karşılaştırılır ve durumu değişmiş kontrollerin ilgili eventleri tetiklenir.(< ı>TextChanged, SelectedIndexChanged .)

7. Validate

Sayfa üzerindeki validatorlerin server side eventleri tetiklenir. Böylece doğrulama işlemi sadece istemci tarafına bırakılmamış olur.

8. “Postback” Events

Postback işlemine neden olmuş kontrollerin eventleri çalışır. Örneğin bir buton tıklandığı zaman yapılacak işlemleri bu aşamada Button.Click, Button.Command gibi metodlarda bildiririz.

9. Page.PreRender + Control.PreRender

Sayfa render edilmeden ve Viewstate kayıt edilmeden önce yapılacak işlemler bu metodlarda yazılabilir. Özellikle kontroller üzerinde yapılacak son değişiklikler bu aşamada yapılır.

10. Page.SaveViewState

Kontrollerin yeni değerleri ve sayfanın durumu sunucuya yapılacak bir sonraki dönüşte hatırlansın diye Viewstate nesnesine kayıt edilir.

11. Page.Render

12. Page_Unload

Temizlik işlemlerinin yapıldığı bu evrede sayfa istemciye gönderilmiştir. Bu metodu açık kalmış dosya ve database bağlantıları kapatmak veya request-response ile ilgili loglama yapmak gibi işlemler için kullanılabilir.

ASP.NET Page Life Cycle (Sayfa Yaşam Döngüsü)” üzerine 14 düşünce

  1. Dogan

    Merhaba Ahmet Bey
    Emekleriniz için ne kadar teşekkür etsem azdır.
    Ben asp.net c# ve sql server ı çok iyi öğrenmek istiyorum. Çalışmalara başladım fakat bu konuda bana yol gösterirseniz sevinirim.Özel ders alabileceğim konusunda mükemmel öğretmenlere ihtiyacım var.
    tek hedefim bu c# ve sql programlamayı çok iyi öğrenmek istiyorum.amacım web programlamaSaygılar Sunarım
    Çalışmalarınızda Başarılar

    Cevapla
  2. Ahmet Kaymaz Yazar

    Merhaba Doğan,sana bazı tavsiyelerde bulunabilmek için yazılım geçmişini, deneyimini bilmem gerekiyor. Eğer yolun başındaysan öncelikle web mimarisini, html dilini, başlangıç olarak javascript bilmen web programlamaya hakimiyetini artıracaktır. Ardından veya bunlara paralel olarak veritabanı mantığı(MS Access veya SQL Server üzerinde çalışarak), SQL dilini, query hazırlama, yazılım algoritma, C# programlama dilini, OOP yöntemini sırasını takip edebilirsin.Özellikle .NET platformuyla web veya windows uygulama geliştirmek çok kolaylaştı. Bunların kodlamasını bir şekilde öğrenirsin önemli olan yazılım geliştirme algotirmanı geliştirmendir. Büyük resmi görmek için çoğu zaman sadece coder olmak yetmiyor. Bu algoritmik bakış hem database modellerken hem de C# ile kodlama yaparken yaptığın işin kalitesini artıracaktır.Özel eğitime gelince. Bunu pek tavsiye etmiyorum. En azında kendimi senin yerine koyduğumda bunun katma değerinin fazla olacağına inanmıyorum. Bunun için piyasada bulunan eğitim kurumlarını deneyebilir veya internet’teki kaynakları kullanabilirsin. Eğitim kurumları için temelinin olması işini kolaylaştıracaktır. Yani başlangıcı, doğrudan bir eğitimin kurumunda yapmak bana pek mantıklı gelmiyor. parana ve emeğine yazık olabilir. Bunun için kendi çabalarınla önce bir altyapı oluşturman gerekiyor.Yine de dediğim gibi bundan sonraki yol haritası senin bilgi birikimine ve deneyimine varsa akademik geçmişine bağlı.

    Cevapla
  3. Hüseyin

    Merhaba Ahmet BEY,Ben üçüncü kuşak dillerle (Pl/1,Cobol,vb) kurumsal uygulamalar tasarladım,geliştirdim, eğitim düzeyim de buna uygun.
    web tabanlı uygulamalar konusunda hiç deneyimim olmadı ama çok merakım var. bu mertakımı bir hobi olmaktan daha çok profesyonel bir yapıya dönüştürmek istiyorum. Bu konuda nette yaptığım araştırmalarda; asp.net,C# ve Veri tabanı konusunda çalışmam gerektiğine inandım. Bu konudaki tavsiyelerinize ihtiyacım var. Görüşünüzü e-mail yoluyla yazarsanız sevinirm.
    İyi çalışma dileklerimle.

    Cevapla
  4. Ahmet Kaymaz Yazar

    Merhaba Hüseyin Bey,Günümüzde herşeyin webe endexli olması, birçok paket programın web versiyonunun daha tercih edilmesinden dolayı en kısa zamanda web ortamına geçmekle doğru karar vermiş olursunuz. Şu anda web uygulamaları için en uygun platform hiç şüphesiz .NET platformudur.
    .NET’te web uygulama geliştirmek için herhangi bir .NET Framework tabanlı dil(C#, VB.NET, Delphi) ve bir veri tabanı (MS Access, MS SQL Server, Oracle) bilmeniz gerekir. Ben kişisel olarak, C# ve SQL Server tavsiye ederim. Bunlarla birlikte web uygulamalarının istemci tarafı da önemli olduğu için JavaScript ve HTML dillerini de zamanla öğrenmeniz faydanıza olacaktır.Kişiye göre değişse de size tavsiyem öncelikle web uygulamalarının mimarisini öğrenmenizdir. Bunun için bir html dokümanıyla webe giriş yapabilirsiniz. Ardından eğer zaman kaybı olmayacaksa bir kaç basit asp uygulaması yapabilirsiniz. Daha sonra gerçek bir programlama dili olan C#’a geçiş yaparsınız. Bir şekilde kod yazarsınız hiç önemli değil. Önemli olan web uygulamasının algoritmasına, çalışma biçimine hakim olmanız. Web uygulaması, desktop uygulamasından farklı bir yapıda olduğu için biraz zorluk çekebilirsiniz. Bir e-book ile web uygulamalarının kavramlarına aşina olmanız işin başlangıcı için doğru bir karar olacaktır. Birçok kişi için gereksiz görülse de benim fikrim ilk önce HTML dilini öğrenmek ardından dinamik web uygulamalarına geçmektir. HTML dili http://www.w3.org/html/ adresinden başka bir kaynağa ihtiyacının olmayacağını düşünüyorum. ASP.NET için de ilgili Türkçe sitelerine takılabilir ve bir kitapevine gidip ASP.NET ile ilgili dili, anlatımı, örnekleri size uygun düşen bir kitap seçebilirsiniz.Yorumumu, size mail ile gönderdim. Bu değerlendirmenin başkası için de bir yanıt olacağını düşünerek buraya da ekledim.Kolay gelsin,

    Cevapla
  5. Mustafa

    Merhaba Ahmet bey,Yukaridaki aciklamalariniza ek olarak benimde bir sorum olucak. Web tasarimi icin en uygun secimin .Net platformu oldugundan bahsetmisiniz. Neden php yerine .Net ile calismaliyiz? .Net’in avantajlari nedir php ile karsilastirdigimiz da? Neden Facebook gibi bir cok buyuk websitesi php tercih etmektedir? Bende .Net uzerinde kendimi gelistirmeye calisan biriyim. Fakat yukardaki sorulara yorum yaparsaniz eminim bir cok arkadasimi ve beni de bu konuda bilgiilendirmis olacaksiniz. Simdiden teskkurler.

    Cevapla
  6. cenk

    hocam elinize sağlıkta.burdaki yazı msdn.microsoft.com adresindeki yazının birebir kopyası.En azından sizde birşeyler ilave etseymişsiniz çok daha güzel olacakmış.Yinede elinize sağlık.

    Cevapla
  7. Ahmet Kaymaz Yazar

    Cenk,bu konu nihayetinde yoruma dayalı bir konu olmadığı için doğrudan Microsoft’tan okuyarak yazmamı mantıklı buluyorum. Ayrıca sen benim yerimde olsaydın ne eklerdin merak ediyorum.

    Cevapla
  8. Cenk

    Hocam bu konu ile ilgili bilgim olsaydı zaten sitenizi ziyaret etme gereği duymazdım.Fikrimce asp.net öğrenme yolundaki en önemli konuların başında page life cycles geliyor.Microsoft’ tan okuyarak bizi bilgilendirmenizde hem ayrı bir meziyet, hemde bencede mantıklı bir durum.Teşekkür ediyorum.Sorunuza gelince.Sizin yerinizde olsaydım bende microsofttaki kaynaktan yararlanır ancak birebir kopyasını yazmazdım.Ek olarak üzerine koyabileceğim bir durum göremiyorsam; en azından bu yazıyı msdn’ den aldığıma dair küçük bir dipnot düşerdim.Bilgi paylatıkça artar.Ama birazda emeğe saygı.

    Cevapla
  9. Osman

    Ahmet Bey makalelerinizin birkaçı okudum.Makalelerinizde anlattığınız konuları derinliklerine kadar incelediğiniz için size teşekkür etmek istedim.Saygılarımla.

    Cevapla

Bir cevap yazın

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

Time limit is exhausted. Please reload CAPTCHA.