Session چیست ؟
وب سایت ها state less هستند یعنی اینکه هربار که صفحه ای به سمت سرور ارسال می شود یک نمونه ی جدید از
این صفحه ساخته می شود واطلاعات فعلی این صفحه از بین می رود همچنین پروتکل http نیز یک
پروتکل state
less است و نمی تواند اطلاعات
یک کلاینت را روی صفحه ذخیره کند و اگر کاربر بعضی از اطلاعات را درج کند و به
صفحه ی بعد حرکت کند، داده های این صفحه گم می شود و کاربر ممکن است نتواند این
اطلاعات را برگرداند.با توجه به مطالبی که گفته شد ما به مکانی برای ذخیره اطلاعات
نیازمندیم،session امکاناتی را فراهم میکند تا بتوان اطلاعات را در حافظه ی سرور
ذخیره کرد .به ازای هر کلاینت داده های session به صورت مجزا
ذخیره می شود و session یکی از بهترین ویژگی های asp.net است چون امن است
و در آن می توان هر نوع object را ذخیره کرد.
درواقع session
مدت زمانی است که که کاربر با یک صفحه ی سایت در تعامل است و درواقع
از دید برنامه نویسی session state فقط یک
حافظه است که به صورت یک دیکشنری یا hash table است
که هر ردیف این جدول یک زوج مرتب key _ value است که به راحتی
می توان اطلاعات را درون session ریخت یا اطلاعات کاربر را از آن خواند.
مزیت های session :
1.session وضعیت
های یک کاربر را در سراسر application نگه میدارد.
2.پیاده سازی session آسان است وبه راحتی میتوان انواع object ها را
ذخیره کرد.
3.به ازای هر کلاینت داده ها
به صورت مجزا ذخیره می کند.
مشکلات session:
1.در حالتی که حجم زیادی از
کاربران روی سایت باشند چون داده های session درون حافظه ی
سرور است باعث میشود کارایی سایت پایین بیاید
ذخیره کردن مقادیر و بازیابی آن
از session :
عمل ذخیره و بازیابی مقادیر در
sessionکاملا شبیه به view state است ومیتوان از طریق System.Web.SessiontState.HttpSessionState با session ها ارتباط برقرار کرد چون کلاس پیاده سازی session در asp.net را فراهم می کند.کدهای زیر برای ذخیره و بازیابی مقادیر درون session مورد استفاده قرار میگیرد.
// Sessionذخیره
کردن مقادیر در
Session["UserName"] =
txtUser.Text;
// sessionچک کردن مقادیر در
if (Session["UserName"] != null)
{
// Sessionبازیابی مقادیر از
lblWelcome.Text = "Welcome : " + Session["UserName"];
}
شما
میتوانید حتی یک objectرا
درون sessionذخیره
کنید مانند زیر
//Sessionذخیره
کردن مقادیر در
Session["DataSet"] =
_objDataSet;
// sessionچک
کردن مقادیر
if (Session["DataSet"] != null)
{
//Sessionبازیابی مقادیر از
DataSet _MyDs = (DataSet)Session["DataSet"];
}
پاک کردن Sessionها از روی متغیر های Session :
در جدول زیر لیست متدهایی که
برای پاک کردن Sessionها مورد استفاده قرار میگیرد
رامشاهده می کنید:
|
متد
|
شرح
|
|
Session.Remove(strSessionName);
|
یک آیتم را از مجموعه ی Session پاک می کند
|
|
Session.RemoveAll()
|
تمام آیتم های مجموعه Session را پاک می
کند
|
|
Session.Clear()
|
تمام آیتم ها ی مجوعه Session را پاک میکند
و تفاوتی بین این متدClearو
RemoveAll نیست و متدRemoveAll متدclear را صدا میزند
|
|
Session.Abandon()
|
Sessionفعلی را کنسل میکند
|
فعال و غیر فعال کردن Sessionها:
برای کارایی بهینه تر میتوان
یک Session را فعال یا غیر فعال کردچون وجود Session در تمام
صفحات ممکن است باعث افزایش سربار وکاهش کارایی شود،بنابراین بهتر است به جای
اینکه یک Sessionهمیشه فعال باشد،فقط در صفحه
هایی که به آن نیاز است یک Sessionرا فعال کرد.به دو روش می توان
Session را فعال کرد
1.page_level :از این طریق می توان Session در یک صفحه ی
خاص را با استفاده ازصفت EnableSessionState فعال یا غیر فعال کرد مانند شکل زیر:

در این روش فعالیت های Session برای یک صفحه خاص غیر فعال است وحتی می توان Sessionرا به صورت Readonly در
آورد و صفحه ای که Session آن به صورت ReadOnly است فقط این اجازه را می دهد تا به داده های Session دسترسی داشت و نمی توان آن را دستکاری کرد

.ApplicationLevel: در این روش SessionState می تواند برای سراسر WebApplication فعال یا غیر فعال شود واین کار با استفاده از EnableSessionState درون Web.Config
انجام می شود

توصیه می شود که از PageLevel
برای فعال و غیر فعال کردن Session استفاده
کنید چون ممکن است ،فقط بعضی از صفحات به Session نیاز
داشته باشند .
SessionState یعنی
همه ی تنظیماتی که ما برای نگه داری Session درون سایتمان
انجام می دهیم و SessionState یک مبحث
مهم است که تمام تنظیمات مربوط به پیکره بندی Session را بیان می کند.
پیکربندی session در web.config:
اگر تنظیمات مربوط به session را در فایل web.config
ی که مربوط به این وب سایت
است انجام دهید تنظیمات فقط به این پروژه اعمال می شود اما اگر تنظیمات مربوط به session را در web.config ی که به ان فایل
پیکر بندی ماشین می گویند انجام دهید این تنظیمات به کل سایت هایی که بر روی این
کامپیوتر هستند اعمال می شود.
SessionID : asp.netاز یک شناسه ی 120 بیتی برای ذخیره هر sessionاستفاده می کند وزمانی
که کلاینت داده ای را درخواست
می کند asp.net
به sessionID نگاه
می کند و داده های مرتبط با این SessionID را بر می گرداند و مراحل این کار در زیر توضیح داده شده است:
1. ابتدا کلاینت به سایت
مراجعه می کند وبعضی از اطلاعات این کلاینت درون session ذخیره
میشود.
2. سرور یک شناسه منحصربه فرد برای
کلاینت می سازد وسپس اطلاعات را درون session
state provider ذخیره
می کند .
3. دوباره کلاینت بعضی از
اطلاعات را درخواست می کند, serverبا استفاده از session_id اطلاعات را ازsessionprvider برمی گرداند و به object تبدیل
می کند.

Session Event :
ابتدا بیایید نگاه مختصری به SessionEvent
بیندازیم 2 نوع رویداد مربوط به Session ها درون asp.net وجود دارد و عبارتند از
Session_start
Session_End
شما می توانید این 2رویداد را
دستکاری کنید و برای آنها دستوراتی درون
فایل global.asax تنظیم کنید و زمانی که یک
Session مقدار دهی اولیه می شود رویداد Session_start اجرا
می شود.رویداد Session_End زمانی
اجرا میشود که مدت زمان اعتبار Session به اتمام رسیده باشد ویا کاربر Signoutشود و صفحه را ترک کند.
void Session_Start(object sender, EventArgs e)
{
دستورات مربوط به زمانی که Sessionجدید مقدار دهی میشود
}
void Session_End(object sender, EventArgs e)
{
دستورات
مروط به اتمام Session
}

در asp.net حالت
های زیر برای یک session قابل دسترس است :
·
InProc
·
StateServer
·
SqlServer
·
Custom
به ازای هر sessionState یک SessionProvider مهیا است و شکل زیر
ارتباط بین sessionState و SessionProviderرا نشان میدهد.

تصویر بالا بیانگر این است که براساس SessionState ای
که انتخاب می شود یک SessionStateProvider
انتخاب می شود و زمانی که Asp.net اطلاعاتی را برمبنای SessionId درخواست
میکند،با توجه به نوع session، sessionProvider متناظر با
آن مسئول فرستادن اطلاعات مربوط به این session است.
جدول زیرحالت های Session و providerهای
متعلق به آنها را نمایش میدهد.
|
حالت های Session
|
State Provider
|
|
InProc
|
In-Memory Object
|
|
StateServer
|
Aspnet_state.exe
|
|
SQLServer
|
DataBase
|
|
Custom
|
CustomProvider
|
علاوه بر جدول بالا حالت دیگری
به نام "OFF" نیزوجود دارد که در صورت انتخاب این گزینه Session
برای application غیر فعال می شود با توجه به اینکه هدف از این مقاله استفاده از Session است به
4حالت SessionState نگاهی
می اندازیم:
از المنت <sessionstate>
درون فایل WebConig
برای پیکره بندی Session استفاده می شود.
بعضی از این خصوصیات که در تگ <sessionstate>
استفاده می شود عبارتنداز Mode,timeout,sqlConnectionString وCustemProvier .
انواع SessionMode ها
الف- InprocSessionMode :درون asp.net به
طور پیش فرض مقدار خاصیت Mode
برایر inproc است و زمانی که این حالت فعال است ،اطلاعات Session
بر روی حافظه ی همین سرورکه برنامه
اجرا می شود،ذخیره می شود. این بهترین
حالتی است که کارایی webApplication را بالا می برد چون داده ها بر روی حافظه ی سیستم جاری ذخیره می
شود اطلاعات به سرعت قابل دسترسی است.

چون داده های Session در حافظه یapplication
جاری است
بنابراین با ریست کردن server داده ها گم می شود که این موضوع بزرگترین عیب Inproc محسوب
می شود. اگر کلاینتی درخواست داده های
خاصی را بدهد،StateProvider
داده ها را از حافظه می خواند
و به کلاینت برمی گرداند و باید درون فایل Web.Config ،
SessionModeرا نوشته و علاوه بر ان خاصیت TimeOut را نیز
تنظیم کرد

TimeOut به این معناست که این Session تا چند دقیقه دیگر اطلاعات را درخود نگه میدارد که این خصوصیت را
درون کدها C# نیز میتوان به صورت زیر نیزتنظیم کرد
Session.TimeOut=30;
چه زمان هایی از Inproc استفاده می کنیم؟
چون Inproce داده ها
را درون Application جاری ذخیره می کند، برای سایت های کوچک و جاهایی که تعداد کاربران
خیلی کم است مفید است.
مزیت ها ی Inproc
:
1.داده های Session را درون حافظه ی برنامه ی جاری ذخیره می کند و بنابراین دستیابی به داده ها سریع است .
2. نیاز به Serialization
برای ذخیره داده ها درون حافظه نیست.
3. پیاده سازی آن خیلی آسان
است و شبیه به استفاده از ViewState
است.
معایب Inproc
:
هرچند Inproc سریع ترین و عمومی ترین مکانیسم است اما محدودیت هایی دارد
1. اگردر زمانی که وضعیت Session
برابر Inproc است WorkerProcess
،ApplicationDomain
،ریست شود تمام اطلاعات گم
می شود.
2. هرچند سریع ترین روش است
اما زیاد بودن کاربران و داده های Session روی کارایی آن تاثیر می گذاردبنابراین ازاین
حالت نمی توان در سناریوهای WebGadren استفاده کرد.
ب- StateServerSessionMode :این روش اغلب outProc نامیده
می شود، StateServer از یک WindowsService که مستقل از IIS
است استفاده می کند وداده
های Session
بر روی سرور مجزا ذخیره میشود که مستقل از IISاست بنابراین درصورت Reset شدن
سرور اطلاعات پاک نمی شود .SessionState
به طور کامل
توسط Aspnet-State.exe مدیریت می شود .
پیکره بندی WebServerها:
برای استفاده از webService باید
درون CommandPrompt
دستور زیر را تایپ کنید:
net start aspstate

حال نگاهی به پیکره بندی Web.config
و تنظیمات StateServer می اندازیم ابتدا باید خصوصیت StateConnectionString را تنظیم کرد تا سیستمی که StateServerرا اجرا می کند مشخص شود.به
طور پیش فرض ConnectionString از IP با مقدار 127.0.0.1(یعنی کامپیوتر فعلی ) و پورت شماره 42424
استفاده می کند.
<configuration>
<sessionstate mode="stateserver"
cookieless="false"
timeout="20"
sqlconnectionstring="data
source=127.0.0.1;user id=<user id>;password=<password>"
server="127.0.0.1"
port="42424" />
</configuration>
خصوصیت StateNetworkTimeDate نیزحداکثرثانیه ای است که برای پاسخ سرویس
منتظرمی ماند و مقدار آن به طور پیش فرض 10است.
چگونه یک StateServerکارمی کند؟
ازStateServer برای جلوگیری ازگم شدن داده هادرزمان reset شدن Server استفاده می شودو stateServer توسط پروسه ی
aspnet_state.exe که به عنوان
یکWindowsService شناخته می شود ، دستکاری می شود و
این پروسه تمام داده های Session را
دستکاری می کند امانیاز است تا داده ها قبل از ذخیره شدن درون StateServer ، Serialize شوند.

همانطور که در شکل بالا نشان داده
شده است کلاینت ها درخواست خود را به WebServer می
دهند و سپس سرور داده های sessionرابر روی StateServer ذخیره میکند.که StateServerممکن است سیستم جاری باشد یا
سیستمی دیگر که کاملا مستقل ازIIS است ومحلی که StateServerروی ان قرار میگردبه خصوصیت StateConnectionString وابسته است .
برای تغییر محل StateServerابتدا IP را
تغییر دهید و مطمئن شوید که AspNet_State.exe برروی آن انجام می شود در
غیر این صورت زمانی که شما تلاش می کنید داده هارا درون Sessionذخیره کنید خطای زیر به شما نشان داده
می شود.

زمانی که شما می خواهید داده
ای را درون Sessionذخیره کنید داده ها شما توسط StateProvider درون
StateServerذخیره می شوند و در زمان بازگشت
داده ها ،StateProvider داده ها را از StateServer
باز میگرداند.

مزیت ها و مشکلات این روش:
مزیت ها :داده ها را مجزا از IIS نگه
میدارد و این باعث می شودتا هر موضوعی در رابطه با IIS اختلالی
درون SessionState ایجاد
نکند و این روش برای WebGarden ها مناسب است .
مشکلات:StateServerهمیشه باید ابتدا کاملاload شود
و سپس اجرا شودوهمچنین عمل Serialization وdesrialization
به کندی صورت می گیرد.
ج- SqlServerSessionMode:این Sessionبرای
شما امنیت و اعتماد بیشتر در مدیریت Sessionها
درون asp.netدارد و دراین روش نیز داده ها ابتدا به
صورت Serialization درون پایگاه داده ها ذخیره می شود

پیکره بندی SqlServerSessionMode: درون SqlServerSessionMode داده های Sessionدرون
SqlServerذخیره می شود بنابراین باید یک
ConectionString
برای dateBase
،درون web.conig
ایجاد شود.بعداز این کار باید SqlServerرا پیکره بندی کرد و در اینجا نحوه ی
پیکره بندی sqlserver با استفاده از دستور aspnet_regsql شرح داده می شود
.
از درون CommandPrompt به
پوشه ی نسخه فعلی Framework
بروید
دستور aspnet_regSqlرا اجرا کنید

|
پارامتر
|
توصیف پارامتر
|
|
-ssadd
|
یک پشتیبان برای SQLServer
mode session stateایجاد می کند
|
|
-sstype p
|
P یعنی اینکه داده های session باید یر روی serverذخیره
شود
|
|
-S
|
نام سرور را مشخص میکند
|
|
-U
|
نام کاربر ی را مشخص میکند
|
|
-P
|
پسورد را مشخص میکند
|
حال برنامه sqlServer را باز کنید و مشاهده می کنید که یک پایگاه داده به نام AspStateایجادشده که دارای 2جدول به نام های aspStateTempApplication وAspStateTempSessionاست وداده های Session
شما درون جدول AspStateTempSession قرار می
گیرد مانند شکل زیر:

چه زمانی از SqlServerSessionMode استفاده می شود؟
1.این روش امن ترین روش برای
مدیریت SessionState است
.
2.داده ها را درون یک پایگاه
داده متمرکز نگه می دارد.
3.زمانهایی که به طور متوالی server شما
Resetمی شود از این روش استفاده
کنید.
4.این روش مناسب webGaren ها نیز است.
5.زمانی که می خواهید Sessionرا بین2نوع متفاوت application
به اشتراک گذارید از این روش استفاده کنید.
مشکلات :
1.سریال کردن اطلاعات باعث
ایجاد سربار بر روی application می شود.
2.از آنجایی که Session
همیشه توسط server های متفاوت اجرا و یا دستکاری می شود باید مواظب باشیدتا SqlServer همیشه در حال اجرا باشد.
د- customSessionMode:
با اینکه عموما از SessionModeهای SqlServer,Inproc,StateServer استفاده می شود اما نیاز است تا درباره اساس CustomSession
مطالبی بدانیم ، CustomSessionMode خیلی
جذاب است زیرا کنترل کامل بر روی Sessionرا
به شما می دهد و حتی می توانید الگوریتمی را برا ی تولید SessionId بنویسید.
شما میتوانید با استفاده از کلاس پایه ی SessionStateStoreProviderBase یک CustomProvider را پیاده
سازی کنید تا داده های Sessionرا
به روش های دیگر ذخیره سازی کند و همچنین می توانید یک SessionID جدید را
به وسیله پیاده سازی یک Interfaceبه نام SessionIDManager تولید کنید.درشکل زیر متدهایی را که در زمان پیاده سازی customSession صدا زده می شود را مشاهده
می کنید.

1. درون متد
Initialize شما می توانید CustomProvider را تنظیم کنید واین متد connection و Provider مربوط به آنرا
مقداردهی اولیه می کند.
2. متد SetItemExpireCallbackبرای تنظیم کردن SessionTimeOut استفاده
می شود ومی توان هریک از متدهایی را که در زمان SessionExpireصدا زده می شوند را رجیستر
کرد.
3. متد InitializeRequest
برای هر درخواستی صدا زده می شود و از متدCreateNewStoreDate
برای ساختن یک نمونه ی جدید از SessionStateStoreData استفاده
می کند.
چه زمان هایی از CustomSessionMode استفاده می شود؟
1.زمانی که میخواهید داده های Sessionرا درجایی جدا از SqlServer ذخیره کنید.
2.زمانی که مجبور هستید از
جدول های موجود برای ذخیره SessionDate استفاده
کنید.
3.زمانی که نیاز دارید تا SessionID هایی مخصوص برای خودتان بسازید.
پیکره بندی CustomSessionMode :

مزیت های CustomSessionMode :
1. به وسیله ی این روش شما می توانید
از بعضی از جدول های موجود در سیستمتان برای ذخیره ی داده های Sessionاستفاده کرد و این برای زمانی مناسب است که شما مجبورید از DataBaseهای قدیمی به جای SqlServer استفاده کنید.
2. این روش وابسته به IIS نیست
بنابراین Reset کردن سرور تاثیری بر روی داده های Session نمی
گذارد.
3. شما با این روش می توانید الگوریتم هایی برای تولیدSessionID
بنویسید.
مشکلات CustomSessionMode
:
1. پردازش داده ها بسیار کند
است .
2. ساختن provider برای CustomStateیک کار خیلی سطح پایین است که
نیازبه دقت خیلی زیادی دارد تا از امنیت
آن مطمئن شوید.
بیشتر پیشنهاد می شود که از سه
حالت قبلی استفاده کنید تا اینکه خودتان یک Provider بسازید.
|
گردآوری و ترجمه
|
خانم
آسیه عباسی
|
|
نام شرکت
|
چاوش
داده پردازان فارس
|
|
منابع
|
سایتهای
msdn , codeproject
|
session چیست – state less – پروتکل state less – گم شدن داده های صفحه – ذخیره اطلاعات در حافظه سرور – session state - مزیت های session - مشکلات session - ذخیره کردن مقادیر و بازیابی آن از session – view state – system.web.sessionstate.httpsessionstate – session در asp.net - پاک کردن session - Session.Remove - Session.RemoveAll() - Session.Clear()-Session.Abandon() - فعال و غیر فعال کردن Sessionها - page_level- EnableSessionState – enablesessionstate=”readonly” – ApplicationLevel – SessionState - پیکربندی session در web.config – SessionID - session state provider - Session Event - Session_start - Session_End – حالت های موجود برای session ها – InProc – StateServer – SqlServer – Custom - State Provider - OFF – تعیین عبارتنداز Mode,timeout,sqlConnectionString وCustemProvier در فایل web.config - انواع SessionMode ها – InprocSessionMode – مزیت های inproc - معایب inproc - StateServerSessionMode – روش outProc - پیکره بندی WebServerها – تنظیم StateConnectionString در web.config – چگونگی کار state server – مزیت و مشکلات state server – پیکربندی sql server با استفاده از دستور aspnet_regsql – aspStateTempApplication - وAspStateTempSession – اساس CustomSession - کلاس پایه SessionStateStoreProviderBase - پیاده سازی CustomProvider - پیکره بندی CustomSessionMode - مزیت های CustomSessionMode - مشکلات CustomSessionMode -