جستجو در محصولات

گالری پروژه های افتر افکت
گالری پروژه های PSD
جستجو در محصولات


State Management در ASP. NET 2.0 (بخش يازدهم)
-(53 Body) 
State Management در ASP. NET 2.0 (بخش يازدهم)
Visitor 1117
Category: کامپيوتر

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 در برنامه هاي وب را ادامه مي دهيم . 

Timeout
يكي ديگر از تنظيمات مهم در ارتباط با  session state ، مشخص كردن مدت زمان timeout است . مقدار در نظر گرفته شده براي خصلت فوق ( تعريف شده در فايل web.config ) ، مدت زمان انتظار ASP.NET  قبل از حذف session را مشخص مي كند ( عدم دريافت هيچگونه درخواست در بازه زماني مشخص شده ) .
در نمونه كد زير به ASP.NET اعلام شده است كه اگر پس از گذشت 20 دقيقه درخواستي از سرويس گيرنده دريافت نگرديد ، session آن را حذف كن .

<sessionState 
       timeout="20" />

خصلت فوق يكي از مهمترين پارامترهاي مديريت session در برنامه هاي وب است كه عدم مقداردهي مناسب آن مي تواند نتايج نامطلوبي را در ارتباط با كارآئي يك برنامه وب به دنبال داشته باشد . در زمان مقداردهي پارامتر فوق مي بايست به اين نكته دقت شود كه اولا" زمان در نظر گرفته شده به اندازه اي كوتاه باشد كه سرويس دهنده بتواند پس از سپري شدن مدت زمان اندكي كه كاربر از برنامه استفاده نمي نمايد ، منبع ارزشمند حافظه را آزاد نمايد  و  ثانيا" كاربر بتواند بدون نگراني در خصوص از دست دادن session خود با خيالي آسوده از برنامه استفاده نمايد .
در صورت نياز ، مي توان مقداردهي پارامتر فوق را از طريق كد نيز انجام داد . به عنوان نمونه در مواردي كه يك session حاوي يك حجم غيرمتعارف از اطلاعات باشد ، مي توان مدت زمان حيات session را محدودتر كرد . كد زير نحوه تغيير مقدار پارامتر فوق را به 10 دقيقه نشان مي دهد .

 Session.Timeout = 10

Mode
با استفاده از خصلت mode مي توان نحوه ذخيره سازي اطلاعات session  را مشخص كرد . به اين خصلت مي توان  مقاديري نظير InProc ، off ، StateServer ، SQLServer و Custom را نسبت داد . در واقع به كمك خصلت فوق  ، استراتژي ذخيره سازي اطلاعات session مشخص مي گردد .
 در ادامه با هر يك از موارد فوق بيشتر آشنا خواهيم شد . قبل از آن لازم است به يك نكته مهم اشاره گردد . در صورتي كه برنامه ASP.NET بر روي بيش از يك سرويس دهنده وب هاست شده باشد  ( كه از آن با نام web farm ياد مي شود ) ، مي بايست دامنه پيكربندي را گسترش داد تا اين اطمينان ايجاد شود كه سرويس دهندگان وب همساز مي باشند . در غيراينصورت ، ممكن است يك سرويس دهنده اطلاعات موجود در session را با روشي متفاوت نسبت به سرويس دهنده ديگر ، رمز نمايد . بديهي است در چنين مواردي اگر كاربر از يك سرويس دهنده به سرويس دهنده ديگر هدايت شود ، در session وي اختلال ايجاد خواهد شد . براي حل اين مشكل مي بايست با مراجعه به بخش <machineKey>  فايل machine.config  تنظميات مورد نظر را بگونه اي انجام داد كه شيوه رمزنگاري session بر روي يك سرويس دهنده با سرويس دهنده ديگر يكسان و سازگار باشد .

 InProc
مقدار پيش فرض خصلت mode مي باشد و  عملكرد آن همانند ذخيره سازي session state در نسخه هاي قديمي ASP است . در اين روش اطلاعات در پردازه مشابه ASP.NET worker threads  ذخيره مي گردند . اين روش بالاترين كارآئي و كمترين ماندگاري  را دارد . در صورتي كه سرويس دهنده به هر دليلي راه اندازي مجدد گردد ، اطلاعات session از بين خواهند رفت . روش فوق براي اكثر وب سايت هاي كوچك مناسب است . در مواردي كه برنامه وب در يك web farm هاست شده باشد ، از اين روش نمي توان استفاده كرد . در چنين مواردي و به منظور به اشتراگ گذاشتن اطلاعات session بين چندين سرويس دهنده ، مي بايست از  گزينه  Out-of-Process و يا سرويس SQL Server state استفاده كرد . 
در برخي موارد ممكن است  برنامه نويسان به اين نتيجه رسيده باشند كه كاربران اطلاعات session خود را بدون هيچگونه دليلي از دست مي دهند . همين امر باعث مي شود كه آنان استفاده از گزينه اي غير از InProc را در دستور كار قرار دهند .  در ASP.NET ، حوزه  برنامه ها به دلايل متعددي ممكن است راه اندازي مجدد گردد ( نظير اعمال تغييرات در پيكربندي ، بهنگام سازي صفحات ) . 
توجه داشته باشيد ، در زمان استفاده از  StateServer و يا SQLServer ، اشيائي مي توانند در  session state  ذخيره گردند كه قابليت سريال شدن را داشته باشند . در غيراينصورت ، ASP.NET قادر به انتقال و يا ارسال اشياء به state service و يا ذخيره آنها در بانك اطلاعاتي نخواهد بود .

 off
با انتخاب مقدار فوق براي خصلت mode ، مديريت state در تمامي صفحات يك برنامه وب غيرفعال خواهد شد . بديهي است با غيرفعال كردن session شاهد بهبود ملموس كارآئي در وب سايت هائي خواهيم بود كه عملكرد و سرويس دهي آنها مشروط به استفاده از session  نمي باشد . 

StateServer
با در نظر گرفتن مقدار فوق براي خصلت mode ، از يك سرويس ويندوز جداگانه براي مديريت state استفاده مي گردد . سرويس فوق بر روي سرويس دهنده مشابه اجراء مي گردد ولي در خارج از پردازه اصلي ASP.NET قرار مي گيرد . رويكرد فوق داراي مزايا و معايب مختص به خود مي باشد . مهمترين مزيت استفاده از يك سرويس دهنده ديگر براي ذخيره اطلاعات session ، عدم وابستگي آن به پردازه ASP.NET است . در چنين مواردي با راه اندازي مجدد پردازه ASP.NET ( به هر دليل ) ، اختلالي در داده ذخيره شده در session ايجاد نخواهد شد چراكه آنها در يك سرويس دهنده جداگانه نگهداري شده اند . از مهمترين معايب و يا بهتر بگوئيم محدوديت هاي رويكرد فوق ، افزايش تاخير زماني در زمان ارسال اطلاعات session بين دو پردازه است . بديهي است در صورتي كه فركانس دستيابي و تغيير اطلاعات ذخيره شده در session بالا باشد ، سرعت و كارآئي يك برنامه وب كاهش مي يابد.
در زمان استفاده از StateServer ، مي بايست مقدار  stateConnectionString را مشخص كرد . پارامتر فوق ، آدرس  IP كامپيوتري را كه بر روي آن سرويس StateServer اجراء شده است را به همراه شماره پورت مربوطه مشخص مي نمايد ( شماره پورت توسط ASP.NET تعيين مي گردد و معمولا" لزومي به تغيير آن وجود ندارد ) . بدين ترتيب ، مي توان StateServer را بر روي كامپيوتر ديگر هاست كرد . در صورتي كه قصد تغيير تنظيمات پيش فرض را نداشته باشيم ، از سرويس دهنده محلي استفاده خواهد شد ( با آدرس IP : 127.0.0.1 ) .    
قبل از اين كه برنامه وب بتواند از سرويس فوق استفاده نمايد ، مي بايست آن را اجراء كرد . ساده ترين روش براي انجام اين كار انتخاب گزينه Services از طريق  Control Panel  است . با مشاهده ASP.NET State Service در ليست سرويس ها ، مي توان نحوه اجراء آن را مشخص نمود ( بطور اتوماتيك ) .
در مواردي كه از StateServer استفاده مي گردد ، مي توان براي خصلت اختياري  stateNetworkTimeout  يك مقدار را مشخص نمود .  پارامتر فوق ، حداكثر مدت زمان انتظار براي پاسخ سرويس دهنده بر حسب ثانيه را مشخص مي نمايد . مقدار گزينه پيش فرض ، 10 ثانيه است .

SQLServer
با در نظر گرفتن مقدار فوق براي خصلت mode ،  از يك بانك اطلاعاتي SQL Server براي ذخيره اطلاعات session   استفاده مي گردد . بانك اطلاعاتي مورد نظر توسط خصلت sqlConnectionString مشخص مي گردد . روش فوق متداولترين مكانيزم براي ذخيره state در برنامه هاي وب مي باشد ولي در مقايسه با روش هاي ديگر از سرعت كمتري برخوردار است .
براي استفاده از روش فوق مي بايست از يك سرويس دهنده SQL استفاده شود . مقدار خصلت sqlConnectionString ، همانند الگوي استفاده شده جهت دستيابي به داده توسط ADO. NET است و شامل مشخص كردن يك منبع داده ( آدرس سرويس دهنده ) ، يك رمزعبور و شناسه كاربر ( مگر اين كه از  integrated security استفاده شده باشد ) است . علاوه بر اين ، مي بايست stored procedures  و session موقت بانك اطلاعاتي نصب گردند . stored procedures مسئوليت ذخيره و بازيابي اطلاعات session را برعهده دارند .
ASP.NET شامل يك اسكريپت Transact-SQL براي اين هدف خاص با نام  InstallSqlState.sql  است  كه در
مسير [ C:\[WinDir]\Microsoft.NET\Framework\[Version  قرار دارد .  براي اجراي اسكريپت فوق مي توان از يك برنامه كاربردي SQL Server نظير SQL Server Management Studio يا sqlcmd.exe ( براي سرويس SQL 2005  )  و يا OSQL.exe و Query Analyze ( براي نسخه هاي قبلي ) استفاده كرد . اسكريپت فوق صرفا" يك مرتبه و به منظور ايجاد بانك ، جداول و  stored procedures   مورد نياز اجراء خواهد شد .
نام بانك اطلاعاتي معمولا"  ASPState مي باشد .در واقع ، connection string موجود در فايل web.config  با صراحت نام بانك اطلاعاتي را مشخص نخواهد كرد بلكه صرفا" مكان سرويس دهنده و نوع تائيديه مشخص مي گردد . كد زير نحوه انجام اين كار را نشان مي دهد .

  <sessionState
      sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"
      ...
   />

در صورتي كه قصد استفاده از يك بانك اطلاعاتي با نام ديگر  و ساختار مشابه را داشته باشيم ، كافي است مقدار خصلت  CustomSqlDatabase  برابر با true  در نظر گرفته شود .

 <sessionState
    allowCustomSqlDatabase="true"
    sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI;Initial Catalog=CustDatabase"
     ...
 />


زماني كه از يك بانك اطلاعاتي SQL Server براي ذخيره اطلاعات session استفاده مي گردد ، مي توان از گزينه اختياري sqlCommandTimeout است كرد .  پارامتر فوق ، حداكثر مدت زمان انتظار براي پاسخ سرويس دهنده بر حسب ثانيه را مشخص مي نمايد . مقدار گزينه پيش فرض ، 30 ثانيه است .

Custom
زماني كه براي خصلت mode مقدار  custom  در نظر گرفته  مي شود  ، مي بايست  session state provider را با استفاده از خصلت customProvider  مشخص كرد . خصلت فوق به نام يك كلاس كه بخشي از برنامه وب موجود در دايركتوري  App_Code  است و يا يك اسمبلي كمپايل شده موجود در دايركتوري BIN و يا GAC  ،  اشاره مي نمايد .
ايجاد يك provider سفارشي ، مسائل مختص به خود را دارد و مي بايست با دقت پياده سازي گردد تا بتواند اهدافي نظير امنيت و قابليت توسعه را به خوبي تامين نمايد .  بحث بر روي provider  سفارشي خارج از حوصله اين مقاله است .
برخي توليد كنندگان ممكن است نسخه هائي خاص از state provider را ارائه نمايند كه در صورت نياز و تمايل مي توان از آنها استفاده كرد . به عنوان مثال ، اوراكل ممكن است يك provider سفارشي را ارائه نمايد كه امكان ذخيره اطلاعات  session را در يك بانك اطلاعاتي اوراكل فراهم نمايد . 
در بخش دوازدهم  با application state آشنا خواهيم شد .

برگرفته از سايت سخا روش

Add Comments
Name:
Email:  
User Comments:
SecurityCode: Captcha ImageChange Image