مقالات
Asp.net
Session چیست
دسته
Asp.net
تعداد بازدید
291
تاریخ
۱۳۹۰/۰۴/۲۷

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 -
نظرات شما
عنوان
نظر