State Management در ASP. NET 2.0 (بخش دوازدهم)
اين مطلب از طريق سايت شرکت سخاروش در اختيار شما گذاشته شده است .

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 به دليل عدم كارآئی مناسب  استفاده نمی شود . در مثال قبل ، همواره اين احتمال وجود خواهد داشت كه در شمارنده مقدار درستی ذخيره نگردد ( خصوصا" در مواردی كه ترافيك بالا باشد ) . به عنوان مثال ، در صورتی كه دو سرويس گيرنده در يك زمان مشابه صفحه ای را درخواست نمايند ، دارای مجموعه ای از رويدادها به شرح ذيل خواهيم بود :

به عبارت ديگر ، يكی از درخواست ها باعث افزايش شمارنده نمی گردد ، چراكه دو سرويس گيرنده بطور همزمان به شمارنده دستيابی داشته اند . برای پيشگيری از بروز اين مسئله ، می بايست از متدهای 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 در دنيای دات نت بندرت استفاده می شود چراكه دو كاربرد متداول استفاده از آن با روش های موثرتر ديگر جايگزين شده است .

 فايل 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  عبارتند از :

در بخش پايانی به جمع بندی دوازده مقاله منتشر شده در خصوص  session state خواهيم پرداخت .


استفاده از اين مطلب  با ذکر منبع و اهداف غيرانتفاعی بلامانع است .
http://www.srco.
ir