برنامه نویسیعمومی

Session

 وب سایت ها state less هستند، به این معنی که هربار صفحه ای به سمت سرور ارسال می شود یک نمونه ی جدید از این صفحه ساخته می شود واطلاعات فعلی این صفحه از بین می رود همچنین پروتکل http نیز یک پروتکلstate less  است و نمی تواند اطلاعات یک کلاینت را روی صفحه ذخیره کند و اگر کاربر بعضی از اطلاعات را درج کند و به صفحه ی بعد حرکت کند، داده های این صفحه از دست می رود و کاربر ممکن است نتواند این اطلاعات را برگرداند. با توجه به مطالبی که گفته شد ما به مکانی برای ذخیره اطلاعات نیازمندیم،session امکاناتی را فراهم می آورد تا بتوان اطلاعات را در حافظه ی سرور ذخیره کرد. به ازای هر کلاینت داده های session به صورت مجزا ذخیره می شود . همچنین session یکی از بهترین ویژگی های asp.net است چون امن است و در آن می توان هر نوع object را ذخیره کرد.

درواقع session مدت زمانی است که کاربر با یک صفحه ی سایت در تعامل است و درواقع از دید برنامه نویسی session state فقط یک حافظه است که به صورت یک دیکشنری یا hash table است و هر ردیف این جدول یک زوج مرتب key _ value است که به راحتی می توان اطلاعات را درون session ریخت یا اطلاعات کاربر را از آن خواند.

مزیت های session :

۱.session وضعیت های یک کاربر را در سراسر application نگه می دارد.

۲.پیاده سازی session آسان است وبه راحتی میتوان انواع object ها را ذخیره کرد.

۳.به ازای هر کلاینت داده ها به صورت مجزا ذخیره می کند.

مشکلات session:

۱.در حالتی که حجم زیادی از کاربران روی سایت باشند چون داده های 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ها:

برای کارایی بهینه تر میتوان یک Session را فعال یا غیر فعال کرد چون وجود Session در تمام صفحات ممکن است باعث افزایش سربار و کاهش کارایی شود، بنابراین بهتر است به جای اینکه یک Session همیشه فعال باشد، فقط در صفحه هایی  که به آن نیاز است یک Session را فعال کنیم. به دو روش می توان Session را فعال کرد.

۱.page_level: از این طریق می توان Session در یک صفحه ی خاص را با استفاده ازصفت  EnableSessionState فعال یا غیر فعال کرد مانند شکل زیر:

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

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

<system.web>

  <!- – Disabled Session Application Level – – >

  <pages enablesessionstate=”false” />

</system.web>

توصیه می شود که از PageLevel برای فعال و غیر فعال کردن Session استفاده کنید چون ممکن است، فقط بعضی از صفحات به Session نیاز داشته باشند.

SessionState یعنی همه ی تنظیماتی که ما برای نگه داری Session درون سایتمان انجام می دهیم،  و SessionState یک مبحث مهم است که تمام تنظیمات مربوط به پیکره بندی Session  را بیان می کند.

پیکربندی session در web.config:

اگر تنظیمات مربوط به session را در فایل web.config  ی که مربوط به این وب سایت است انجام دهید تنظیمات فقط به این پروژه اعمال می شود اما اگر تنظیمات مربوط به session  را در web.config ی که به آن فایل پیکر بندی ماشین می گویند انجام دهید این تنظیمات به کل سایت هایی که بر روی این کامپیوتر هستند اعمال می شود.

SessionID:  asp.netاز یک شناسه ی ۱۲۰ بیتی برای ذخیره هر  sessionاستفاده می کند وزمانی

که کلاینت داده ای را درخواست می کند asp.net به sessionID نگاه می کند و داده های مرتبط با این

SessionID را بر می گرداند و مراحل این کار در زیر توضیح داده شده است:

۱. ابتدا کلاینت به سایت مراجعه می کند وبعضی از اطلاعات این کلاینت درون session ذخیره میشود.

۲. سرور یک شناسه منحصربه فرد برای کلاینت می سازد وسپس اطلاعات را درون  session state  provider ذخیره می کند .

۳. دوباره کلاینت بعضی از اطلاعات را درخواست می کند, serverبا استفاده از session_id  اطلاعات را ازsessionprvider  برمی گرداند و به object تبدیل می کند.

 

Session Event:

ابتدا بیایید نگاه مختصری به SessionEvent بیندازیم ۲ نوع رویداد مربوط به Session ها درون asp.net وجود دارد و عبارتند از:

Session_start

Session_End

شما می توانید این ۲رویداد را دستکاری کنید  و برای آنها دستوراتی درون فایل 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های متعلق به آنها را نمایش میدهد.

 

علاوه بر جدول بالا حالت دیگری به نام “OFF” نیز وجود دارد که در صورت انتخاب این گزینه Session برای application غیر فعال می شود با توجه به اینکه هدف از این مقاله  استفاده از Session است به ۴حالت 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  را نیز تنظیم کرد.

<system.web>

    <- –  InProc Session In Application – – >

 <sessionstate  mode=”InProc”  timeout=”30″ />

</system.web>

TimeOut   به این معناست که این Session  تا چند دقیقه دیگر اطلاعات را درخود نگه میدارد که این خصوصیت را درون کدها  C# نیز میتوان به صورت زیر نیزتنظیم کرد:

Session.TimeOut=30;

 

چه زمان هایی از Inproc استفاده می کنیم؟

چون Inproce داده ها را درون Application جاری ذخیره می کند، برای سایت های کوچک و جاهایی که تعداد کاربران خیلی کم است مفید است.

مزیت ها ی Inproc:

۱.داده های Session را درون حافظه ی برنامه ی جاری ذخیره می کند و بنابراین دستیابی به  داده ها سریع است.

۲. نیاز به Serialization برای ذخیره داده ها درون حافظه نیست.

۳. پیاده سازی آن خیلی آسان است و شبیه به استفاده از ViewState است.

معایب Inproc :

هرچند  Inproc سریع ترین و عمومی ترین مکانیسم است اما محدودیت هایی دارد.

۱. اگر در زمانی که وضعیت Session برابر Inproc است WorkerProcess،ApplicationDomain ، ریست شود تمام اطلاعات گم می شود.

۲. هرچند سریع ترین روش است اما زیاد بودن کاربران و داده های 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 با مقدار ۱۲۷.۰.۰.۱(یعنی کامپیوتر فعلی ) و پورت شماره ۴۲۴۲۴ استفاده می کند.

<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 نیز حداکثرثانیه ای است که برای پاسخ سرویس منتظرمی ماند و مقدار آن به طور پیش فرض ۱۰است.

چگونه یک 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 را اجرا کنید.

 

حال برنامه  sqlServer را باز کنید و مشاهده می کنید که یک پایگاه داده به نام AspState ایجادشده که دارای ۲جدول به نام های aspStateTempApplication و AspStateTempSessionاست و داده های Session  شما درون جدول  AspStateTempSession قرار می گیرد مانند شکل زیر:

 

چه زمانی از SqlServerSessionMode استفاده می شود؟

۱. این روش امن ترین روش برای مدیریت SessionState است .

۲. داده ها را درون یک پایگاه داده متمرکز نگه می دارد.

۳. زمانهایی که به طور متوالی server شما  Resetمی شود از این روش استفاده کنید.

۴. این روش مناسب webGaren ها نیز است.

۵.زمانی که می خواهید  Sessionرا بین ۲ نوع متفاوت application به اشتراک گذارید از این روش استفاده کنید.

مشکلات:

۱. سریال کردن اطلاعات باعث ایجاد سربار بر روی application می شود.

۲. از آنجایی که Session همیشه توسط server های متفاوت اجرا و یا دستکاری می شود باید مواظب باشیدتا SqlServer همیشه در حال اجرا باشد.

د- CustomSessionMode:

با اینکه عموما از SessionModeهای SqlServer ,Inproc ,StateServer استفاده می شود اما نیاز است تا درباره اساس CustomSession مطالبی بدانیم، CustomSessionMode خیلی جذاب است زیرا کنترل کامل بر روی  Sessionرا به شما می دهد و حتی می توانید الگوریتمی را برا ی تولید SessionId بنویسید. شما میتوانید با استفاده از کلاس پایه ی SessionStateStoreProviderBase  یک CustomProvider را پیاده سازی کنید تا داده های  Sessionرا به روش های دیگر ذخیره سازی کند و همچنین می توانید یک SessionID جدید را به وسیله پیاده سازی یک Interface به نام SessionIDManager تولید کنید. درشکل زیر متدهایی را که در زمان پیاده سازی customSession  صدا زده می شود را مشاهده می کنید.

 

۱.  درون متد Initialize شما می توانید CustomProvider را تنظیم کنید واین متد connection و Provider مربوط به آنرا مقداردهی اولیه می کند.

۲.  متد   SetItemExpireCallbackبرای تنظیم کردن SessionTimeOut استفاده می شود و می توان هریک از متدهایی را که در زمان  SessionExpireصدا زده می شوند را رجیستر کرد.

۳.  متد InitializeRequest برای هر درخواستی صدا زده می شود و از متدCreateNewStoreDate برای ساختن یک نمونه ی جدید از SessionStateStoreData استفاده می کند.

چه زمان هایی از CustomSessionMode استفاده می شود؟

۱. زمانی که میخواهید داده های Session را درجایی جدا از SqlServer ذخیره کنید.

۲. زمانی که مجبور هستید از جدول های موجود برای ذخیره SessionDate استفاده کنید.

۳. زمانی که نیاز دارید تا SessionID هایی مخصوص برای خودتان بسازید.

پیکره بندی CustomSessionMode:

<sessionstate mode =”custom” costomProvider  =”AccessProvider”>

     <providers >

         <add name  =”accessProvider” type =”CustomDataType”/>

     </providers>

</sessionstate>

مزیت های CustomSessionMode:

۱. به وسیله ی این روش شما می توانید از بعضی از جدول های موجود در سیستمتان برای ذخیره ی داده های  Sessionاستفاده کرد و این برای زمانی مناسب است که شما مجبورید از DataBaseهای قدیمی به جای SqlServer استفاده کنید.

۲. این روش وابسته به IIS نیست بنابراین Reset کردن سرور تاثیری بر روی داده های Session نمی گذارد.

۳. شما با این روش می توانید الگوریتم هایی برای تولید SessionID بنویسید.

مشکلات CustomSessionMode:

۱. پردازش داده ها بسیار کند است.

۲. ساختن provider برای CustomState یک کار خیلی سطح پایین است که نیازبه دقت خیلی زیادی دارد تا از امنیت آن مطمئن شوید.

بیشتر پیشنهاد می شود که از سه حالت قبلی استفاده کنید تا اینکه خودتان یک Provider بسازید.

با کارت بانکی باشگاه ایران هاست پولتان به حسابتان باز می گردد.

همین حالا رایگان عضو شوید

مدیر بلاگ

مشخصات مدیر

نوشته های مشابه

یک نظر

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید

بستن
دکمه بازگشت به بالا
بستن
بستن