( تعداد نمایش : 887 )

مفاهیم و معماری session states ASP .NET

در این بخش به بررسی Session State  خواهیم پرداخت .

مفاهیم و چالش ها
در مدت زمان حیات یک برنامه به مواردی برخورد می کنیم که لازم است جهت ذخیره سازی اطلاعات از امکانات پیشرفته تری استفاده گردد . به عنوان مثال ، یک برنامه ممکن است به ذخیره اطلاعات پیچیده ای نظیر اشیاء سفارشی داده و استفاده از آنها در سایر صفحات نیاز داشته باشد . ارسال اینگونه اطلاعات از طریق کوکی و یا یک query string مشکل و یا غیرممکن است . علاوه بر این ، در برخی موارد ملاحظات امنیتی در رابطه با داده وجود دارد  و نمی توان اطلاعات مربوط به یک سرویس گیرنده را در view state و یا کوکی ذخیره کرد .
در چنین مواردی می توان از امکانات از قبل تعبیه شده session state در ASP.NET استفاده کرد .
مدیریت session state یکی از ویژگی های برجسته ASP.NET است که به کمک آن می توان هر نوع داده ئی را در حافظه سرویس دهنده ذخیره کرد . بدین ترتیب ، یک سطح حفاظتی مطلوب در خصوص داده ایجاد خواهد شد چراکه اطلاعات برای سرویس گیرنده ارسال نخواهند شد و برای هر جلسه کاری منحصربفرد می باشند .
هر سرویس گیرنده ای که به برنامه دستیابی داشته باشد دارای یک session متفاوت و مجموعه ای از اطلاعات متمایز و مختص به خود است . session state برای ذخیره اطلاعاتی نظیر آیتم های خریداری شده توسط کاربر از یک سایت و استقرار آنها در سبد خرید در زمان حرکت از یک صفحه به صفحه دیگر بسیار مفید و موثر واقع می شود .
با استفاده از session state می توان اطلاعات مورد نظر را از طریق یک صفحه ذخیره و در سایر صفحات از آنها استفاده کرد .
با این که session state بسیاری از مشکلات در ارتباط با سایر روش های مدیریت state را برطرف نموده است ولی خود نیز دارای چالش های مختص به خود است . به عنوان مثال ، با بکارگیری روش فوق در برنامه های وب ، سرویس دهنده وب ملزم به ذخیره اطلاعات بیشتری در حافظه سرویس دهنده خواهد شد.  این موضوع می تواند همزمان با افزایش کاربران یک برنامه بر روی کارآئی آن تاثیر بگذارد . چراکه درصد استفاده از یک منبع محدود ( حافظه ) افزایش خواهد یافت .  بنابراین ، لازم است استفاده از session state  با دقت و بررسی تمامی جوانب کار صورت پذیرید .

معماری session
مدیریت session به عنوان بخشی از استاندارد HTTP محسوب نمی گردد . بنابراین لازم است که ASP.NET عملیات بیشتری را به منظور پیگیری اطلاعات session انجام دهد .
ASP.NET هر session را از طریق یک شناسه ۱۲۰ بیتی منحصربفرد پیگیری و از یک الگوریتم اختصاصی برای تولید آن استفاده می نماید .  بنابراین حداقل این تضمین از لحاظ تئوری ایجاد می گردد که عدد تولید شده منحصر بفرد بوده و به اندازه کافی تصادفی است  تا امکان و یا احتمال تشخیص و حدس آن توسط مهاجمان به حداقل مقدار خود برسد ( مهاجمان با بکارگیری روش هائی موسوم به مهندسی معکوس در تلاش جهت آگاهی از این موضوع هستند که یک سرویس گیرنده خاص از چه شناسه ای برای session استفاده می نماید ) .
شناسه ، تنها اطلاعات مبادله شده بین سرویس دهنده وب و سرویس گیرنده است . زمانی که سرویس گیرنده شناسه session خود را  ارائه می نماید ، ASP.NET  در اولین اقدام جستجو جهت یافتن session متناظر با آن را انجام می دهد . در صورتی که ماحصل فرآیند فوق مثبت باشد ، داده از state server بازیابی و به اشیاء مورد نظر تبدیل می گردد . در ادامه ، اشیاء فوق در یک مجموعه خاص استقرار می گردند تا امکان دستیابی به آنها از طریق کد وجود داشته باشد . فرآیند فوق بطور اتوماتیک انجام می شود .
شاید برای شما این سوال مطرح شده باشد که ASP.NET ، اطلاعات مربوط به session را در چه مکانی ذخیره و چگونه آنها را serialize و deserialize می نماید ؟ در  ASP کلاسیک ، session state به عنوان یک شی COM پیاده سازی شده است که در کتابخانه asp.dll  مستقر می گردد . در ASP.NET ، اینترفیس برنامه نویسی تقریبا” یکسان است ولی نحوه پیاده سازی آن با ASP کلاسیک کاملا” متفاوت است .
زمانی که ASP.NET یک درخواست HTTP را بررسی می نماید ، آن را از طریق مجموعه ای از مدول های مختلف که قادر به واکنش در خصوص رویدادهای برنامه می باشند ، به حرکت در می آورد . SessionStateModule ، یکی از مدول های موجود در این زنجیره است ( موجود در namespace با نام  System.Web.SessionState ) . مدول فوق شناسه session را تولید ، داده session را از ارائه دهندگان خارجی state بازیابی و داده را  به درخواست مورد نظر نسبت می دهد . همچنین مدول فوق ، اطلاعات مربوط به session را پس از اتمام پردازش صفحه ، ذخیره می نماید.
توجه داشته باشید که مدول SessionStateModule عملا” داده session را ذخیره نمی نماید . در واقع ، داده session در عناصر مجزاء نگهداری می گردد که به آنها state provider می گویند .
شکل ۱ معماری session state در ASP.NET را نشان می دهد .

StateManagement7 مفاهيم و معماری session  states ASP .NET
شکل ۱ : معماری session state در ASP.NET

نکته آخر در ارتباط با معماری فوق نحوه پیگیری کوکی از یک درخواست به درخواست دیگر است . برای این که session state به درستی کار کند ، سرویس گیرنده می بایست شناسه session خود را همراه با هر درخواست ارائه نماید . بدین منظور از دو روش مختلف استفاده می گردد .

  • استفاده از  کوکی : در این حالت ، شناسه session از طریق یک کوکی خاص  (ASP.NET_SessionId) که ASP.NET بطور اتوماتیک و در زمان استفاده از مجموعه session آن را ایجاد می نماید ، ارسال می گردد . گزینه فوق به صورت پیش فرض انتخاب می گردد و مشابه رویکردی است که از آن در نسخه های اولیه ASP  استفاده می گردید .

  • استفاده از URLs اصلاح شده : در این حالت ، شناسه session از طریق یک URL اصلاح شده خاص ارسال می گردد . گزینه فوق یک ویژگی جدید در ASP.NET است و به پیاده کنندگان اجازه می دهد در مواردی که سرویس گیرنده از کوکی حمایت نمی نماید ، از session state در برنامه های وب استفاده نمایند .

استفاده از session state
با استفاده از کلاس  System.Web.SessionState.HttpSessionState  که در یک صفحه ASP.NET به عنوان شی session از قبل تعبیه شده پیش بینی شده است ، می توان با session state ارتباط برقرار کرد . نحوه اضافه کردن و بازیابی داده در مجموعه session state همانند  view state است .
مثلا” می توان یک Dataset را در session قرار داد . کد زیر نحوه انجام این کار را نشان می دهد .

Session(“ds”) = ds

کد زیر نحوه بازیابی و تبدیل داده ذخیره شده در session را نشان می دهد .

ds = Ctype(Session(“ds”),DataSet)

امکان دستیابی به session state در تمامی برنامه و برای کاربر جاری امکان پذیر است . session state به دلایل متعددی ممکن است از بین رود :

  • بستن و فعال کردن مجدد مرورگر توسط کاربر

  • دستیابی به صفحه مشابه از طریق یک پنجره جداگانه مرورگر توسط کاربر

  • اتمام تاریخ اعتبار session به دلیل عدم فعالیت کاربر در یک بازه زمانی خاص   ( مقدار پیش فرض ۲۰ دقیقه )

  • خاتمه دادن به عمر مفید یک session از طریق کد و توسط برنامه نویس  ( استفاده از متد Session.Abandon)

در دو مورد اول ، session همچنان در حافظه باقی خواهد ماند چراکه سرویس دهنده وب از بستن مرورگر و یا تغییر پنجره توسط کاربر آگاهی ندارد . در چنین مواردی ، session آخرین لحظات عمر خود را در حافظه طی می نماید و عملا” غیرقابل دسترس باقی می ماند تا زمانی که عمر آن به اتمام رسد .
علاوه بر موارد فوق ، زمانی که application domain مجددا” ایجاد گردد ، session state حذف خواهد شد . فرآیند فوق در زمان بهنگام سازی برنامه و یا تغییر در تنظیمات پیکربندی انجام می شود .
همچنین به منظور حصول اطمینان از صحت عملکرد برنامه ، application domain بطور ادواری بازسازی می شود . در صورتی که رویکرد فوق باعث بروز مسائلی می گردد ، می توان اطلاعات session state را به صورت out of process ذخیره کرد ( در بخش بعد در این رابطه توضیح خواهیم داد ) . در مدل نگهداری state به صورت out-of-process ، اطلاعات session حتی با غیرفعال شدن application domain همچنان باقی خواهند ماند .
جدول ۱  ، متدها و خصلت های مختلف کلاس  HttpSessionState را نشان می دهد .

member عملکرد
Count تعداد آیتم های ذخیره شده در مجموعه session جاری را مشخص می کند .
IsCookielessSession مشخص می نماید که پیگیری session از طریق یک کوکی و یا یک URLs اصلاح شده انجام می گیرد.
IsNewSession مشخص می نماید که آیا session برای درخواست جاری ایجاد شده است . در صورتی که session state حاوی داده نباشد ، ASP.NET خود را درگیر پیگیری آن و یا ایجاد یک کوکی برای آن نمی نماید. در مقابل ، session با هر درخواست مجددا” ایجاد می گردد .
Mode نحوه ذخیره سازی اطلاعات session state توسط ASP.NET را تشریح می نماید . مد ذخیره سازی بر اساس تنظیمات انجام شده در web.config مشخص می گردد .
SessionID یک رشته به همراه شناسه منحصربفرد session را برای سرویس گیرنده جاری ارائه می نماید .
StaticObjects یک مجموعه فقط خواندنی از آیتم های session که توسط تگ های <object runat=server> در فایل global.asax تعریف شده است را ارائه می نماید . معمولا” از این روش استفاده نمی گردد و صرفا” پتانسیلی است در جهت سازگاری با برنامه نویسی ASP است .
Timeout مدت زمانی را که پس از سپری شدن آن امکان حذف session جاری وجود دارد ، مشخص می نماید . در بازه زمانی فوق نباید درخواستی از سرویس گیرنده دریافت شده باشد .
مقدار پارامتر فوق را می توان از طریق برنامه تغییر داد تا زمینه استفاده از یک session با طول عمر بیشتر برای عملیات مهم تر فراهم گردد .
Abandon متد فوق session جاری را حذف و  تمامی حافظه اشغال شده توسط session را آزاد می نماید .
بدین منظور می توان از یک  صفحه log off استفاده کرد تا این اطمینان حاصل شود که حافظه سرویس دهنده در اسرع وقت و به سرعت آزاد می گردد .
Clear متد فوق تمامی آیتم های session را حذف می نماید ولی شناسه session جاری را تغییر نمی دهد .

جدول ۱  : متدها و خصلت های کلاس  HttpSessionState


در بخش نهم بحث خود را در ارتباط با session state  ادامه داده و به بررسی یک نمونه مثال کاربردی خواهیم پرداخت

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن