نویسنده : |
www.srco.ir |
|
86.12.15 |
|
587 بار مشاهده |
|
با استفاده از 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 : رويداد فوق در پاسخ به يك خطاء غيرقابل پيش بينی، محقق می گردد .