|
عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
|
State Management در ASP. NET 2.0 (بخش يازدهم) |
مديريت وب |
6463 |
8 |
4.5 |
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 در برنامه های وب را ادامه می دهيم .
Timeout
يكی ديگر از تنظيمات مهم
در ارتباط با session state ، مشخص كردن مدت زمان
timeout است . مقدار در نظر گرفته شده برای خصلت فوق (
تعريف شده در فايل web.config ) ، مدت زمان انتظار
ASP.NET قبل از حذف
session را مشخص می كند (
عدم دريافت هيچگونه درخواست در بازه زمانی مشخص شده ) .
در نمونه كد زير به
ASP.NET اعلام شده است كه اگر پس از گذشت 20 دقيقه
درخواستی از سرويس گيرنده دريافت نگرديد ، session آن را
حذف كن .
<sessionState
timeout="20" /> |
خصلت فوق يكی از مهمترين پارامترهای مديريت
session در برنامه های وب است كه
عدم مقداردهی مناسب آن می تواند نتايج نامطلوبی را در ارتباط با كارآئی يك برنامه
وب به دنبال داشته باشد . در زمان مقداردهی پارامتر فوق می بايست به اين نكته
دقت شود كه اولا" زمان در نظر گرفته شده به اندازه ای كوتاه باشد كه سرويس دهنده
بتواند پس از سپری شدن مدت زمان اندكی
كه كاربر از برنامه استفاده نمی نمايد ، منبع
ارزشمند حافظه را آزاد نمايد و ثانيا" كاربر بتواند بدون نگرانی در
خصوص از دست دادن session خود با خيالی آسوده از برنامه
استفاده نمايد .
در صورت نياز ، می توان مقداردهی پارامتر فوق را از طريق كد نيز انجام داد . به
عنوان نمونه در مواردی كه يك session حاوی يك حجم
غيرمتعارف از اطلاعات باشد ، می توان مدت زمان حيات session
را محدودتر كرد . كد زير نحوه تغيير مقدار پارامتر فوق را به 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 آشنا خواهيم شد .