بررسی چرخه طول عمر یک صفحه ASP.Net

در این مقاله می خواهیم، چرخه زندگی یک صفحه ASP.Net را از زمانی که کاربر درخواست می کند تا زمانی که صفحه بسته شود، بررسی کنیم.

بررسی چرخه طول عمر یک صفحه ASP.Net

در ابتدا می پردازیم به اینکه منظور از "چرخه زندگی یک صفحه ASP.Net" چیست:

زمانی که یک صفحه توسط مرورگر کاربر درخواست می شود، این درخواست مراحل مختلفی را طی می کند و اتفاقات بسیاری در پس زمینه می افتد تا خروجی تولید شود یا پاسخ مناسب به کاربر برگردانده شود. مدت زمان بین درخواست کاربر و پاسخ سرور را چرخه زندگی صفحه "Page Life Cycle" می گویند.

درخواست: شروع چرخه (ارسال توسط کاربر)

پاسخ: پایان چرخه (ارسال توسط سرور)

شکل زیر چگونگی ایجاد یک درخواست را نشان می دهد.

در ادامه، کل فرایند چرخه زندگی صفحه را بررسی می کنیم.

در ابتدا، کاربر از طریق مرورگر یک صفحه یا یک منبع را درخواست می کند. درخواست به سرور IIS ارسال می شود. IIS پردازش درخواست را شروع می کند و یکی از افزونه های اولیه مانند aspx. یا ascx. فایل "ASPNET_ISAP" را بارگیری می کند.

ASPNET_ISAP.dll کلاسی به نام “HttpRuntime” تولید می کند و آن را به فرایند در حال اجرا تخصیص می دهد. کلاس HttpRuntime، یک شی “HttpApplication” و این شی یک نمونه از شی “Page” می سازد و متد ProcessRequest() را فراخوانی می کند. این روند، یک چرخه زندگی صفحه ASP.Net و یک HTML Response را تولید می کند.

در طول چرخه زندگی صفحه، 4 مرحله قبل از اینکه HTML Response به کاربر برگردانده شود، وجود دارد. درادامه، همه این مراحل و رویدادهایی را که در آنها اتفاق می افتد مرور خواهیم کرد.

Initialization (مقداردهی اولیه)

Loading (بارگیری)

Rendering (بارگذاری صفحه)

Unloading

فرایندی که توضیح داده شد، با شکل زیر، بهتر درک خواهد شد.

4Stages

در اینجا به تمام مراحل یادشده و رویدادهای (event) می پردازیم. قبل از شروع این بحث، نگاه اجمالی به تمام رویدادها خواهیم داشت.

قبل از اینکه، این رویدادها را با جزییات بررسی کنیم، بهتر است بدانیم در این 4 مرحله چه اتفاقاتی می افتد.


Initialization: در طول این مرحله، ویژگی IsPostback تنظیم می شود. این ویژگی تعیین می کند که این یک درخواست تکراری است و یا برای اولین بار است که این صفحه پردازش می شود (درخواست جدید). کنترل هایی در صفحه هستند که باید ویژگی UniqueID آنها نیز تعریف شود. اگر درخواست Postback باشد، در این مرحله هنوز داده ها لود نشده و مقدار کنترل ها هم از view state بازیابی نشده اند.


Loading: اگر درخواست تکراری (Postback) باشد، داده ها از view state بارگیری می شوند.


Rendering: قبل از بارگیری صفحه (Rendering)، داده های view state برای صفحه و کنترل هایش ذخیره می شود. در طول این مرحله، صفحه موردنظر متد Render را برای هر یک از کنترل ها فراخوانی می کند، یک ویرایشگر متن فراهم می کند که خروجی آن را در OutputStream مربوط به Property (ویژگی)، Response صفحه می نویسد.


Unloading: بعد از بارگیری کامل صفحه و ارسال به کاربر، Unload فراخوانی می شود و برای دور انداختن آماده است. با این کار، ویژگی های صفحه از قبیل Request و Response نیز Unload می شوند.

حالا یک به یک به رویدادهای هر 4 مرحله می پردازیم:

subEvent

1. PREINIT: به طور پیش فرض، حاوی شی های ساخته شده در صفحه است. این رویداد (Event)، طراحی صفحه را به عهده دارد بنابراین، در رویداد "INIT" می توان به صفحه و کنترل هایش حافظه اختصاص داد. اینجا، در ابتدا شی ای از کلاس Page که در "System.Web" وجود دارد، ساخته می شود و سپس یک لیست از مجموعه تمام کنترل ها به کلاس صفحه و در رویداد "INIT" ادامه پیدا می کند و به کنترل های آن حافظه تخصیص داده می شود. این رویداد برای انجام این کارها استفاده می شود:

- برای چک کردن ویژگی IsPostback تا مشخص شود که پردازش این صفحه برای اولین بار صورت می گیرد یا خیر و اگر postback بود، به این معنی است که داده ها هنوز از view state بارگیری نشده اند. علاوه بر این، اگر کنترلی در این مرحله ساخته شود ممکن است مقدار آن در رویداد بعد دوباره نوشته شود.

- برای دوباره ساختن کنترل های پویا، چرا که پیاده سازی در این رویداد انجام نمی شود.

- تنظیم داینامیک Master Page

protected void Page_PreInit(object sender,EventArgs e )  
{  
} 

2. INIT: در این رویداد، مجموعه یا لیست تمام کنترل هایی که در رویداد "PREINIT" طراحی شده اند، حافظه می گیرند. یا به عبارتی دیگر، تمام کار پیاده سازی در این رویداد انجام می شود. این رویداد می تواند برای مقداردهی اولیه و یا خواندن ویژگی های کنترل ها استفاده شود. توجه داشته باشید که رویداد INIT ابتدا برای پایین ترین کنترل ها در سلسله مراتب به کارگرفته می شود و همین طور بالا میاید تا برای خود صفحه انجام شود.

protected void Page_Init(object sender, EventArgs e )  
{  
}   

3. INITCOMPLETE: این رویداد برای پردازش تمام کارهایی که لازم است تا مقداردهی اولیه کامل شود، استفاده می شود. این رویداد چک می کند که برنامه های پیش اجرا شده است یا نه. به عبارت دیگر چک می کند که به لیست یا مجموعه کنترل ها که اضافه شدند، حافظه تخصیص داده شده یا نه و از آنها نمونه ای ساخته شده یا خیر. همچنین نمی توانیم از این رویداد برای تغییر دادن view state استفاده کنیم، چرا که مقادیر کنترل ها هنوز بارگیری نشده اند.

protected void Page_InitComplete(object sender,EventArgs e )  
{  
} 

4.PRELOAD: در این مرحله، داده های view state و همه کنترل هایش به صفحه بارگذاری می شوند و سپس داده های postback با استفاده از داده های درخواست کاربر، پردازش می شوند.

بنابراین، در این مرحله می توانیم هر تغییری که می خواهیم روی ویژگی کنترل اعمال کنیم.

protected override void OnPreLoad(EventArgs e )  
{  
}  

5. Load: این رویداد، اولین جایی است که در این چرخه، مقادیر کنترل ها بازیابی می شوند. صفحه، متد رویداد OnLoad را برای خود صفحه فراخوانی می کند و سپس به طور بازگشتی این کار را برای تمام کنترل های فرزند انجام می دهد تا تمام کنترل ها و کل صفحه بارگذاری شود.

protected void Page_Load(object sender,EventArgs e )  
{  
} 

6. LOADCOMPLETE: این رویداد، یک تایید است که آیا تمام کنترل ها در تمام صفحه بارگذاری شده اند یا نه.

protected void Page_LoadComplete(object sender,EventArgs e)  
{  
}

7. PRE-RENDER:

 1. پس از اینکه شی page، تمام کنترل ها را که شامل کنترل های فرزند که جزیی از کنترل های ترکیبی هستند، برای بارگذاری صفحه به وجود آورد، بالا می آید.

 2. شیء Page، رویداد PreRender را روی این شیء بالا می آورد و سپس به طور بازگشتی این کار را برای همه کنترل های فرزند انجام می دهد. رویداد PreRender برای کنترل های مجزا پس از انجام این کار بر روی صفحه، انجام می شود.

3. امکان اعمال تغییرات نهایی را به صفحه یا کنترل هایش می دهد.

4. این رویداد، قبل از ذخیره view state اتفاق می افتد بنابراین هر تغییری در این رویداد انجام شود، ذخیره می شود.

5. به عنوان مثال، بعد از این رویداد نمی توانید هیچ ویژگی یک دکمه یا مقدار view state را تغییر دهید.

6. هر کنترل داده-محدودی با یک ویژگی DataSourceID، متد DataBind خود را فراخوانی می کند.

7. برای اعمال تغییرات نهایی روی محتوای صفحه و کنترل هایش از این رویداد استفاده می کنیم.

protected override void OnPreRender(EventArgs e )  
{  
}  

8. RENDER: یک متد مربوط به شیء Page و کنترل هایش است. (نه یک رویداد)

این متد، HTML سمت کاربر، DHTML(داینامیک HTML) و اسکریپتی را که برای نمایش کنترل در مرورگر نیاز است، تولید می کند.

9. RENDERCOMPLETE: این رویداد چک می کند که شیء جاری، روی حافظه بارگذاری شده است یا خیر. ابتدا شی ساخته می شود و سپس بعد از آن مجموعه (Collection) برگردانده خواهد شد.

10. SAVESTATE: این متد، اشیا و اطلاعات مربوط به بارگذاری را به مرورگر کاربر انتقال می دهد. اشیای فعلی اشغال شده توسط حافظه آزاد می شوند و به دوباره به کاربر انتقال داده خواهند شد.

11. SAVESTATE COMPLETE: این رویداد بعد از ذخیره شدن view state برای کل صفحه و کنترل هایش، بالا می آید. در این مرحله هیچ تغییری روی ویژگی ها اعمال نمی شود.

protected override void OnSaveStateComplete(EventArgs e)  
{  
}

12. UNLOAD: در این نقطه، تمام پردازش ها انجام شده است و می توان تمامی اشیای باقی مانده مانند شیء Page را هم دور ریخت. به عبارت دیگر، در این رویداد عملیات پاک سازی (Clean up) شامل بستن فایل و اتصالات دیتابیس، انجام می شود. همچنین، اگر صفحه و کنترل هایش بارگذاری شده باشند، نمی توان روی جریان Response تغییری اعمال کرد.

protected void Page_Unload(object sender,EventArgs e )  
{  
}