|
عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
|
State Management در ASP. NET 2.0 (بخش دوازدهم) |
مديريت وب |
5851 |
46 |
3.3 |
State Management در ASP. NET 2.0
State Management در ASP. NET 2.0 (بخش
دوازدهم)
آنچه تاكنون گفته شده است :
|
بخش اول |
مفاهيم اوليه
|
: |
ضرورت مديريت state در برنامه های وب |
|
بخش
دوم |
view state |
: |
نحوه ايمن سازی اطلاعات ذخيره شده در
view state
|
|
بخش سوم |
view state |
: |
نحوه نگهداری Member Variables و اشياء سفارشی |
|
بخش چهارم |
cross-page posting |
: |
انتقال اطلاعات از يك صفحه به صفحه ای ديگر |
|
بخش
پنجم |
cross-page posting |
: |
نحوه دريافت اطلاعات از صفحه مبداء |
|
بخش
ششم |
Query String |
: |
نحوه انتقال اطلاعات بين صفحات |
|
بخش
هفتم |
كوكی های سفارشی |
: |
نحوه عملكرد كوكی های سفارشی |
|
بخش
هشتم |
Session State |
: |
مفاهيم و معماری session
|
|
بخش
نهم |
Session State |
: |
نحوه استفاده از session state |
|
بخش
دهم |
Session State |
: |
پيكربندی
session در برنامه های وب |
|
بخش يازدهم |
Session State |
: |
پيكربندی
session در برنامه های وب |
در اين بخش با application
state آشنا می شويم .
با استفاده از application state
می توان اشياء سراسری ( global )
را با هدف دستيابی توسط هر يك از سرويس گيرندگان ذخيره كرد . عملكرد
application state بر اساس كلاس
System.Web.HttpApplicationState می باشد كه بطور پيش فرض از طريق شی از قبل تعبيه
شده Application در تمامی صفحات قابل استفاده است .
طرز كار application state مشابه
session state است و از اشيائی با نوع
های مشابه ، نگهداری اطلاعات در سمت سرويس
دهنده و گرامر مبتنی بر ديكشنری استفاده می نمايد . استفاده از يك شمارنده سراسری
به منظور نگهداری تعداد دفعاتی كه يك عمليات خاص توسط تمامی سرويس گيرندگان يك برنامه وب انجام
می شود ، يك نمونه متداول استفاده از
application state می باشد .
مثلا" می توان يك event handler در فايل
global.asax را تعريف كرد
تا تعداد session ايجاد شده و يا تعداد
درخواست های دريافتی توسط يك برنامه را ثبت كند . همچنين ، می توان از روشی مشابه
در Page. Load به منظور تعيين تعداد دفعاتی كه يك صفحه
خاص توسط سرويس گيرندگان مختلف درخواست شده است ، استفاده كرد .
كد زير نحوه انجام اين كار را مشخص می كند .
Protected
Sub Page_Load(ByVal
sender As
Object,
ByVal e
As EventArgs)
Handles
Me.Load
Dim Count
As
Integer =
CType(Application("HitCounter"),
Integer)
Count += 1
Application("HitCounter")
= Count
lblCounter.Text = Count.ToString()
End
Sub |
لازم است مجددا" به اين نكته اشاره گردد كه آيتم های
application state به عنوان
شی ذخيره می
گردند ، بنابراين
می بايست در زمان بازيابی آنها را cast كرد
. تاريخ اعتبار و يا مصرف
آيتم های ذخيره شده در application state
هرگز به اتمام نخواهد رسيد و تا زمانی كه
برنامه و يا سرويس دهنده راه اندازی مجدد
نگردد و يا حوزه برنامه خود را
refresh ننمايد ( به علت تنظيمات ادواری اتوماتيك پردازه
و يا بهنگام سازی يكی از صفحات و يا عناصر موجود در برنامه ) ، امكان استفاده از
آنها وجود خواهد داشت .
امروزه اغلب از
application state به دليل عدم كارآئی مناسب استفاده نمی
شود . در مثال قبل ،
همواره اين احتمال وجود خواهد داشت كه در شمارنده مقدار درستی ذخيره نگردد ( خصوصا"
در مواردی كه ترافيك بالا باشد ) . به عنوان مثال ، در صورتی كه دو سرويس گيرنده در
يك زمان مشابه صفحه ای را درخواست نمايند ، دارای مجموعه ای از رويدادها به شرح ذيل
خواهيم بود :
-
كاربر A مقدار جاری
شمارنده را ( فرضا" عدد 432 ) بازيابی می نمايد .
-
كاربر B مقدار جاری شمارنده را ( فرضا" عدد 432 )
بازيابی می نمايد .
-
كاربر A مقدار شمارنده را تغيير و آن را به 433 تغيير
می دهد .
-
كاربر B مقدار شمارنده را تغيير و آن را به 433
تغيير می دهد .
به عبارت ديگر ،
يكی از درخواست ها باعث افزايش شمارنده نمی گردد
، چراكه دو سرويس گيرنده بطور
همزمان به شمارنده دستيابی داشته اند . برای پيشگيری از بروز اين مسئله ، می بايست
از متدهای Lock و Unlock
استفاده كرد . با استفاده از متدهای فوق در هر لحظه صرفا" به يك سرويس گيرنده اجازه
دستيابی به مجموعه
application state داده می شود .
Protected
Sub Page_Load(ByVal
sender As
Object,
ByVal e
As EventArgs)
Handles
Me.Load
Application.Lock()
Dim Count
As
Integer =
CType(Application("HitCounter"),
Integer)
Count += 1
Application("HitCounter")
= Count
Application.Unlock()
lblCounter.Text = Count.ToString()
End
Sub |
ساير سرويس گيرندگانی كه صفحه را درخواست
می نمايند می بايست تا زمانی كه مجموعه application state
آزاد نشده است ، منتظر
بمانند . اين وضعيت می تواند كاهش
كارآئی برنامه
را به دنبال داشته باشد .
به عنوان يك قانون كلی ، مقاديری كه دائما" و با فركانس بالا
تغيير می يابند نمی توانند كانديدی
مناسب جهت استفاده از
application state باشند .
application
state در دنيای دات نت بندرت استفاده می شود چراكه دو كاربرد متداول استفاده
از آن با روش های موثرتر ديگر جايگزين شده است .
-
در گذشته ، از application
state برای ذخيره ثوابت در سطح برنامه نظير يك
connection string بانك اطلاعاتی استفاده می گرديد . هم اينك در دات نت می
توان اين نوع ثوابت را به سادگی در فايل web.config كه
به مراتب از انعطاف بيشتری
برخوردار است ذخيره نمود .
-
در گذشته برای ذخيره اطلاعاتی كه در يك برنامه از
آنها بدفعات استفاده می گرديد و برای توليد اين اطلاعات زمان زيادی صرف می گرديد ،
استفاده می شد ( نظير يك كاتولوگ كامل از محصولات ) . افزايش حجم كاتالوگ و
معتبر سازی داده موجود در اينچنين كاتالوگ هائی ، همواره از مشكلات برنامه نويسان
بوده است . هم اينك و با استفاده از دات نت می توان از فنآوری
cache كه دارای كارآئی بمراتب بالاتری نسبت به روش های
پيشين و بكارگرفته شده در application state است ،
استفاده كرد .
فايل
Global.asax
با استفاده از فايل global.asax می توان كد
مورد نياز جهت برخورد با رويدادهائی در سطح برنامه را
ايجاد كرد . رويدادهای فوق در نقاط
مختلفی از چرخه حيات يك برنامه وب محقق می گردند ( مثلا" زمانی كه
session ايجاد می گردد ) . همين موضوع باعث شده است كه
فايل global.asax بتواند در تعامل مناسب با
ويژگی های state management
قرار بگيرد . مثلا" می توان از فايل global.asax برای
مقداردهی اوليه مجموعه ای از اشياء
كه قصد داريم آنها را در
application state ذخيره نمائيم ، استفاده
كرد .
فايل global.asax ، همانند يك فايل
aspx . است . با اين تفاوت كه اين نوع فايل ها نمی
توانند شامل تگ های HTML و يا ASP.
NET باشند . در مقابل می توان در آنها event handler
مورد نياز را قرار داد . مثلا" فايل global.asax زير در
مقابل رويداد Application.EndRequest از خود واكنش نشان می دهد ( رويدادی كه قبل از
ارسال صفحه برای كاربر محقق می گردد ) .
<%@ Application Language="VB"
%>
<script runat="server">
Sub
Application_EndRequest(ByVal
sender As
Object,
ByVal e
As EventArgs)
Response.Write("<hr>This
page was served at " & DateTime.Now.ToString())
End
Sub
</script> |
event handler فوق از متد
write شی از قبل تعبيه شده Response
برای نوشتن يك footer در پائين صفحه
( تاريخ و زمان
ايجاد صفحه ) استفاده می نمايد .
هر برنامه ASP.NET
می تواند دارای يك فايل
global.asax باشد كه پس از استقرار در دايركتوری مجازی مربوطه ،
ASP.NET آن را بطور اتوماتيك تشخيص
و از آن استفاده خواهد كرد . مثلا" ،
اگر فايل global.asax فوق را در يك دايركتوری مجازی قرار
دهيم ، شاهد نمايش يك footer
در پائين هر يك از صفحات موجود در برنامه
خواهيم بود .
اضافه كردن يك
footer اتوماتيك
در پائين صفحات ، يك عمليات مفيد برای سايت های حرفه ای نمی
باشد . نوشتن يك ركورد در يك بانك اطلاعاتی مختص ثبت وقايع
( log ) ، شايد كاربرد مناسب تری از ويژگی فوق را نشان
دهد . هم اينك تعداد زيادی از برنامه
نويسان برنامه های وب تمايل به استفاده از فايل
global.asax را ندارند .
فايل فوق از مدل code-behind حمايت می نمايد
.
رويدادهای
Application
Application.EndRequest ، صرفا" يكی از رويدادهای موجود
جهت استفاده در فايل
global.asax است . برای ايجاد يك event handler
متفاوت
، می توان يك روتين با نام
دلخواه را ايجاد كرد .
برخی از متداولترين رويدادهای application عبارتند از :
-
Application_Start : در زمان آغاز به كار برنامه و
دريافت اولين درخواست توسط هر يك از كاربران ، محقق می گردد . رويداد فوق در پاسخ
به درخواست های بعدی محقق نخواهد شد . از اين رويداد معمولا" برای ايجاد و يا
cache برخی اطلاعات اوليه استفاده
می شود.
-
Application_End : رويداد فوق پس از اتمام
فعاليت برنامه ، محقق می گردد ( عمدتا" زمانی كه سرويس دهنده وب راه اندازی مجدد می
گردد ) . در روتين مربوطه می توان كد مورد نياز برای پاكسازی را درج كرد .
-
Application_BeginRequest : رويداد فوق پس از
دريافت هر درخواست توسط برنامه ، محقق می گردد ( قبل از اجرای كد صفحه )
.
-
Application_EndRequest : رويداد فوق پس از دريافت هر
درخواست توسط برنامه ، محقق می گردد ( پس از اجرای كد صفحه ) .
-
Session_Start : رويداد فوق زمانی محقق می گردد كه
درخواست يك كاربر جديد دريافت و يك session فعاليت خود
را آغاز نمايد .
-
Session_End : رويداد فوق زمانی محقق می گردد كه مدت زمان حيات يك
session به اتمام رسيده باشد ( از طريق كد و يا بطور
اتوماتيك ) .
-
Application_Error : رويداد فوق در پاسخ به يك خطاء
غيرقابل پيش بينی، محقق می گردد .
در بخش پايانی به جمع بندی دوازده مقاله منتشر شده
در خصوص session state خواهيم پرداخت .