Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

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

Piyasada çok fazla ASP.NET programlayan developer olsa da gerçek manada ASP.NET yaşam döngüsünü bilerek event’leri bilinçli kullananların sayısı oldukça azdır. Bu makalemde ASP.NET yaşam döngüsüne kısa bir giriş yapmış olacağız.
Web uygulamalarını windows uygulamalarından ayıran temel olarak kullanıcı arayüzü değil , sayfanın yaşam döngüsüdür. Bir windows uygulamasını açarsınız üzerinde saatlerce çalışıp kapatırsınız ancak web uygulamaları böyle değildir. Web istekleri çok daha kısa sürelidir. Bir kullanıcı web sitenize girdiğinde herbir isteği servera gönderir ve server bu isteği işleterek cevabı client’a gönderir. Bu kısa bilgi alış verişi her istekte tekrarlanır.
ASP.NET kendi yaşam döngüsü içerisinde her bir stage de önemli eventler gerçekleştirir. Eğer bir kontrolü  dinamik olarak sayfaya ekleyecek olursak bu ekleme işlemini sayfanın yaşam döngüsü içerisinde doğru adımda yapmalıyız , aksi taktirde temalar vs yüklenmeyebilir. Sayfa render olduktan sonra yaratılan bütün nesneler yokedilir.
ASP.NET de bir requestten diğerine veri taşıyabilmenin 4 yolu vardır. Bunlar;
View State,Hidden Fields,Session State,Cookies
Her birinin temelde amacı veri taımak olsa da farklı durumlarda ihtiyaca göre kullanılmaktadır.
ASP.NET de her bir sayfanın ve üzerlerindeki kontrollerin birer yaşam döngüsü bulunmaktadır ve bu döngünün her bir adımında ASP.NET eventler fırlatmaktadır. Her bir adımda kod yazarak sayfa ve kontrollerin davranışlarını değiştirmek mümkündür.
Sayfa yaşam döngüsü uygulama sunucusunun uygulamanızı ne zaman start stop edeceğini , diğer uygulamalardan nasıl izole edeceğini ve kodunuzu nasıl execute edeceğinizi belirler.
ASP.NET uygulamaları genellikle bir web server üzerinde koşar ve bu web server genellikle IIS (Internet Information Service)’dir.
Süreç aşağıdaki gibi işler :
1- Web sitenize istek ilk defa ulaşır.
2- İstek Processing Pipeline’a yönlendirilir ve Processing pipeline bunu ASP.NET runtime’a forward eder.
3-ASP.NET ApplicationManager sınıfının bir instance’ını create eder ve bu sınıf isteğin .NET Framework tarafından execute edileceğini belirler.Application Domain global değişkenlerinizin diğer uygulamalardan izole edilmesini sağlar.
4- Application Domain yaratıldıktan sonra HostingEnviroment sınıfı yaratılır. Bu sınıf host edilen itemlara erişim sağlar , örneğin dizin dosyları.
5-ASP.NET isteği işleyecek çekirdek sınıfların birer nesnesini oluşturur.  HttpContext,HttpRequest,HttpResponse
6-ASP.NET HttpApplication sınıfını yaratır.Bu sınıf Global.asax dosyasının base sınıfıdır.
7-Son olarak da ASP.NET isteği işleyip HttpApplication pipeline’ına sokar. Bu pipeline bir çok event içerir örneği isteğin validasyonu,URL mapping,cache’e erişim ve dahası.

HttpApplication sınıfı bir çok event üretir. Bu eventlerden en çok kullanılanlarına bir göz atalım :
Application_start  : IIS uygulamamızı ilk defa çalıştırdığında bu event tetiklenir.
Application_End  : IIS’den uygulamamız kapatıldığında bu event tetiklenir. Loglama için kullanılabilir.
Application_Error  : Uygulamada bir error alındığı zaman fırlatılır.
Application_LogRequest  : Uygulamaya bir istek gönderildiğinde fırlatılır , bunu isteğe göre custom logging bilgisi yazmak için kullanabiliriz.
Application_PostLogRequest  : İsteğin loglanması tamamlandıktan sonra fırlatılır.

Bütüm bu evenleri Global.asax dosyasından yönetebilirsiniz.
ÖRNEK Global.asax içeriği :
<%@ Application Language=”C#” %>
<script runat=”server”>
void Application_Start(object sender, EventArgs e)
{
Application[“UsersOnline”] = 0;
}

void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application[“UsersOnline”] = (int)Application[“UsersOnline”] + 1;
Application.UnLock();
}

void Session_End(object sender, EventArgs e)
{
Application.Lock();
Application[“UsersOnline”] = (int)Application[“UsersOnline”] – 1;
Application.UnLock();
}
</script>

Global.asx içerisinde uygulama seviyesinde state verisi taşınabilir.
Application.Lock();
Application[“PageRequestCount”] = ((int)Application[“PageRequestCount”]) + 1;
Application.UnLock();

NOT: Bir uygulamadaki aktif kullanıcıların sayısını bulmak için custom bir kod yazmaya gerek yoktur. ASP.NET in içerisinde birçok counter bulunmaktadır.
counter

Yaşam döngüsü eventleri :
PreInit  :  Sayfa için handle edilecek ilk evettir.Page ve Masterpage için dinamik olarak kontrol ekleme çıkarma ve tema set etme için kullanılabilir.
Init : Bütün kontroller initialize olduktan sonra bu event fırlatılır. Content page’e kontol ekleme için kullanılabilir.
InitComplete : Bütün sayfa ve kontroller bittiğinde fırlatılır.
PreLoad : Sayfanın ve kontollerin viewstate’i dolmadan ve postback işletilmeden fırlatılır.
Load : Page bu anda stabil bir durumdadır.
Control (postback) event(s) :Bu anda sayfanın ve kontollerin postbackten dolayı oluşan bütün eventleri çağrılır.
LoadComplete : Bütün kontroller dolmuştur.
PreRender : Sayfadaki ve kontroldeki final değişiklikler için kullanılır.
SaveStateComplete : Bu anda sayfanın ve kontrollerin view state i set edilmiştir.
Render : Sayfa html’e dönüştürüldüğü yerdir. Kendi custom kontollerimizde html değişiklikleri yapabilmek için kullanılabilir.
UnLoad : Bu adımı kaynakları bırakmak için kullanabiliriz.

İlgili Yazılar:

http://www.csharpnedir.com/articles/read/?filter=&author=36&cat=&id=690&title=Asp.Net%202.0%20Temelleri%20:%20Bir%20Web%20Sayfas%C4%B1n%C4%B1n%20Anatomisi

December 7, 2011 - Posted by | ASP.NET | , , , , , , , , , , , , ,

1 Comment »

  1. […] kavrayamadığı için yazdıkları kodlarda beklemedikleri hatalarla karşılabiliyorlar.(bkz:page life cycle) 3- Kavramların mantıksal olarak doğru ayrılmamış olması, yani kod ile html’i […]

    Pingback by ASP.NET Web Forms’dan MVC’ye Geçiş (1) « Koray Kırdinli | October 4, 2012 | Reply


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s