آشنایی با View State ،Session Stateو Application State

چهارشنبه 18 فروردین 1395

در این مقاله می خواهیم به توضیح View state، Session Stateو application state بپردازیم.این مقاله به شما کمک خواهد کرد تا درک بهتری از آنها پیدا کنید وهمچنین چگونگی استفاده ، مزایا و معایب آنها نیز بیان شده است.

آشنایی با View State ،Session Stateو Application State

معرفی
این مقاله تکنیک های مدیریت state های مختلف را نشان میدهد. کار با state ها در برنامه های وب  ASP.NET برای توسعه دهندگان بسیار گیج کننده است . این مقاله به شما کمک خواهد کرد تا درک کنید که چگونه باید از آن  استفاده کنید.

پردازش Web application

هر زمان که یک Web application کامپایل شود، سورس کد این پروژه به یک زبان میانی تولید و اسمبلی خروجی ،یک DLL  است که در پوشه bin دایرکتوری پروژه  بصورت کامپایل شده ،قرار میگیرد .

هنگامی که URL نرم افزار توسط یک کاربر درخواست میشود ، وب سرور، پروژه DLL درخواست شده را در حافظه لود و نمونه ای جدیدی از وب فرم درخواست شده ایجاد میکند. که نتایج ایجاد شده  یک نمونه جدید از وب فرم و تمام کنترلها ومتغییرهای موجود در وب فرم درخواست شده است.

پس از ایجادآن ، چرخه حیات صفحه تکمیل میشود و خروجی  به صورت  HTML   ارسال میشود  و این خروجی به عنوان جواب به مرورگر فرستاده میشود. پس از آن ،شی وب فرم  بلافاصله نابود میشود .

 نمونه کد :

    namespace Test  
    {  
        public partial class _Default : Page  
        {  
            int counter = 0;  
            protected void Page_Load(object sender, EventArgs e)  
            {  
                if(!IsPostBack)  
                {  
                    TextBox1.Text = "0";  
                }  
            }  
      
            protected void Button1_Click(object sender, EventArgs e)  
            {  
                counter = counter + 1;  
                TextBox1.Text =counter.ToString();  
            }  
        }  
    }  

 

توضیح:

زمانی که URL برنامه درخواست شد، " get request" را در رویداد page load چک میکند  و text box را با  0 مقداردهی میکند.

کلیک برروی دکمه ،می تواند یک post request   به سرور وب باشد  ،که یک نمونه جدید از webform1  که  فرایند کامل تولید یک HTML و ارسال آن به  مرورگر کلاینت را انجام میدهد، ایجاد میکند.  این مقادیر از آخرین post call ساخته شده به وب سرور است.

تکنیک های مختلف :state management

state management .1 سمت سرور

View State

Hidden Field

Cookies

Control State

 

state management .2 سمت سرور

Session

Application Object

Caching

می توانید تعدادی از راه های state management همانطور که در بالا ذکر شده را بررسی کنید.

View state

View state تکنیکی برای نگهداری state در کنترل post-back صفحه است ،

به این معنی که ذخیره مقدار صفحه پس از post-back (ارسال و دریافت اطلاعات از سرور) در خود صفحه انجام میگیرد  و داده های  view state میتوانند هنگامی که صفحه در سرور  پست شد ،مورد استفاده قرار بگیرد و یک نمونه جدید از صفحه ایجاد کند.

داده های  View state  ، یک رشته ی سریال کد گذاری base64 هستند که در یک فیلد ورودی پنهان در صفحه ذخیره شده اند ودر هر request  و respons  کاربر، بین مرورگر و سرور جابه جا میشود.

ViewState["VarName"]= store any thing

بر روی وب سرور، در رویداد init  صفحه کد گذاری شده و مرورگر با مقدار به کلاینت ارسال می شود.

    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="mlqif/yufT121LcPxuR5TVSuWVDJ7aU+2ONZy5gYWjTgmggCv5ed4OlAOS+jpYLWSI1hLbIA0cyrLI2YOZPo4RIESahtyWmLMhXbfEJ/GvJIvbfEE+JSHtDaw2iFc/kmz73T0oifsuZN6JzufE1ZI+NL7qrjzpOc9PTadu+Qxxokyw7cfV6ISa+fu9qSmjpYsxVtyxg/Z0QTyZBRaUiMbxWEJNlH3csR1d8HCPtoZ2s=" />  


    namespace Test  
    {  
        public partial class _Default : Page  
        {  
            int TestCounter = 0;  
            protected void Page_Load(object sender, EventArgs e)  
            {  
                if(!IsPostBack)  
                {  
                    TextBox1.Text = "0";  
                    TextBox2.Text = "0";  
                }  
            }  
            protected void Button1_Click(object sender, EventArgs e)  
            {  
                //With out View State  
                TestCounter = TestCounter + 1;  
                TextBox1.Text = TestCounter.ToString();  
      
                if (ViewState["counter"] != null)  
                {  
                    TestCounter = (int)ViewState["counter"] + 1;  
                    TextBox2.Text = TestCounter.ToString();  
                }  
                ViewState["counter"] = TestCounter;  
      
            }  
        }  
    }  

 

مزایای View State

 .1 براحتی پیاده سازی میشود.

 .2 بر روی مرورگر کلاینت  در یک فیلد مخفی به شکل Base64 Encoding String ذخیره میشود ولی رمزگذاری نمیشود و میتواند به راحتی رمزگذاری شود.

 .3 به خوبی با HTTP ، داده ها را انتقال میدهد.

 

معایب View State

 .1سربار عملکرد برای صفحه هایست که با  داده های بزرگ  در View State  ذخیره شده اند.

 .2 بصورت کدگذاری شده ذخیره میشود  و  برای امنیت اطلاعات خیلی حساس استفاده نمیشود.

موارد استفاده

View state  باید هنگامی استفاده شود که کاربر نیاز به ذخیره مقدار کمی از داده ها در مرورگر کلاینت با بازیابی سریع دارد. برنامه نویس نباید از این روش برای نگهداری state ، در صفحه هایی با داده بزرگ استفاده کنند. از این روش  برای ارسال داده ها از یک صفحه به صفحه دیگر استفاده میشود. برای ذخیره اطلاعات حساس امن نیست.

 

ASP.NET Session State

Session State یکی دیگر از روش state management برای ذخیره State است، به معنی آنکه در ذخیره سازی و استفاده از مقادیر مربوط به درخواستهای قبلی کمک می کند.

هر زمان که کاربر ،یک وب فرم  از یک برنامه تحت وب درخواست  کرد، از یک Session ASP.NET برای ذخیره درخواست قبلی دریک دوره زمانی مشخص ،استفاده می شود  .

//Stored Textbox value  
Session["Counter"] = TextBox3.Text;  
  
//Stored Dataset  
   
Session["ds"] = dsData;  
Session variables are stored in a SessionStateItemCollection object that is exposed through the HttpContext.Session property. 

Session variables در یک شی SessionStateItemCollection ذخیره میشوند که از طریق property HttpContext.Session در معرض نمایش قرارمیگیرد.

به طور پیش فرض،  در  session state  تمام برنامه های ASP.NET فعال میشود.

Session state data در تمام صفحات وب به اشتراک گذاشته میشود  ، به عبارت دیگر در هنگام navigating از یک  صفحه، session داده ها در دسترس هستند.

    namespace Test  
    {  
        public partial class SessionTest : System.Web.UI.Page  
        {  
            protected void Page_Load(object sender, EventArgs e)  
            {  
                if (!IsPostBack)  
                {  
                    if (Session["Counter"] == null)  
                    {  
                        Session["Counter"] = 0;  
                    }  
                    TextBox1.Text = Session["Counter"].ToString();  
      
                }  
            }  
            protected void Button1_Click(object sender, EventArgs e)  
            {  
                if (Session["Counter"] != null)  
                {  
                   int SessionCounter = (int)Session["Counter"] + 1;  
                    TextBox1.Text = SessionCounter.ToString();  
                    Session["Counter"] = SessionCounter;  
                }  
            }  
      
            protected void Button2_Click(object sender, EventArgs e)  
            {  
                Response.Redirect("MysessionPage.aspx");  
            }  
        }  
    }  
      
    After navigating to the page mysessionpage.aspx and retrieving value from session.  
      
    namespace Test  
    {  
        public partial class MysessionPage : System.Web.UI.Page  
        {  
            protected void Page_Load(object sender, EventArgs e)  
            {  
                if (Session["Counter"] != null)  
                {  
                    Label1.Text = Session["Counter"].ToString();  
                }  
            }  
        }  
    }  

در متغیرهای Session تک کاربره global data ،بر روی وب سرور ذخیره میشوند ، به این معنی که به طور پیش فرض متغیر session state در حافظه وب سرور ذخیره می شود و در تمام صفحات موجود است اما آن فقط برای یک session میباشد.

SessionID

کوکی ها Client Machine هستند که توسط یک  session ، ذخیره ی session id را انجام میدهد .این session id  توسط وب سرور استفاده میشود.

session id  یک ویژگی منحصر به فرد در مرورگر است که بوسیله داده session  بر روی سرور قابل شناسایی است. مقدار SESSIONID  به طور تصادفی توسط ASP.NET ،در کوکی session  مرورگرتولید و ذخیره میشود. مقدار SESSIONID  در یک کوکی قرار میگیرد و با هر درخواست به برنامه ASP.NET ارسال می شود.

مرجع تعریف: MSDN

کوکی ها یک متن کوتاه هستند که به همراه  درخواست ها و صفحات، بین وب سرور و مرورگر قرار میگیرند. کوکی شامل اطلاعاتی در مورد برنامه های تحت وب هستند که درهر زمان که کاربر از سایت بازدید کرد ،خوانده میشود

 

If the session mode is Inproc and cookieless=true then:

    <sessionState mode="InProc" cookieless="true" customProvider="DefaultSessionProvider" >  

Session id  به عنوان بخشی از URL در هر درخواست ارسال خواهد شد و اگر Session id برداشته  یا تغییر داده شود ، آن به عنوان یک درخواست جدید  در نظر گرفته میشود.

 

Session Modes

 Session Modes   توضیح میدهد که چگونه متغیرهایSession  ذخیره می شوند، به عبارت دیگر چه نوع ذخیره سازی توسط متغیر استفاده می شود و رفتار آن چیست.

رفتار پیش فرض در حافظه در یک  فرآیند  ASP .NETworker است.

 

Session Modes های مختلف موجود در ASP.NET

Off .1

  InProc .2

    StateServer .3

   SQLServer .4

   Custom .5

هر مدل یک رفتار متفاوت در  برنامه تحت وب دارد. و  هر کدام مزایا و معایب خود را دارند.

 هنگامی که در حال کار با یک برنامه ASP.NET با متغیرهای session هستید، بسیار مهم است که  session modes   را به عنوان یکی از تکنیک های مدیریت state درک کنید  session modes   .انتخاب شده به عنوان mode در  webconfig ، قادر به ذخیره  متغیر،  session  و پس از آن مسئول رفتار نرم افزار خواهد بود .

Off

 اگر برنامه هیچ نیاز و یا نیازهایی برای  session stateنداشت،  پس بسیار مهم است که از حالت Off استفاده شود. با استفاده از این کارایی نرم افزار بهتر خواهد بود.

InProc Mode

InProc Mode
می تواند در یک برنامه وب ASP.NET  ، از یک فایل پیکربندی با تنظیم ویژگی های  mode در المنت SessionState   استفاده کند .

    <sessionState mode="InProc" customProvider="DefaultSessionProvider">  

هنگامی کهInproc session state  استفاده میشود، متغیر  session حافظه وب سرور ،در داخل پردازش کننده ASP.NET ذخیره می شود.

تعریف MSDN:

ASP.NET در یک فرایند شناخته شده به عنوان پردازش کننده ASP.NET اجرا می شود. تمام قابلیت های ASP.NET در محدوده این فرآیند اجرا می شوند.

اساسا متغیر session در یک پردازش کننده ی قابل اجرا  IIS  ،ذخیره می شود. بنابراین اگر این درخواست از همان کاربر باشد ، داده ها در دسترس خواهند بود.

مزایای استفاده از InProc:

  .1 
پیاده سازی آسان
  .2  اشیاء پیچیده را می توان بدون ترتیب اضافه کرد.
 .3 
بهترین کارایی را در مقایسه با out-of-process modes دارد.

معایب InProc:

1. قادر به حفظ مقدار های session   زمانیکه پردازش کننده ی  IIS  دوباره راه اندازی میشود ،نیست.
2. مقیاس پذیری یک مشکل عمده است.
3. برای برنامه های کاربردی با  پایگاه وسیع خوب نیست.

هنگامی که شرایط لازم برای یک web farm  و یا web garden وجود داشته باشد  ، توسعه در  حالت " out of process " مانند state server و یا  SQL Server بهترین گزینه هستند.

State Server Session Mode

از دست دادن  session data  نقطه ضعف  آن است ،که دلیل آن پردازش کننده recycle است .که می توان با استفاده از  حالتی دیگر، حالت state server  را کاهش داد.

تعریف  مرجع MSDN

StateServer mode
، یک session state  را در  فرایندی جداگانه به نام ASP.NET state service ذخیره میکند، و تضمین می کند که session state  حفظ شود. اگر برنامه های تحت وب دوباره راه اندازی شوند ، باعث می شود session stateوب سرور ،در یک Web farm در دسترس باشد.

ASP.NET یکی  از  سرویس های ویندوز است که متغیر session داده ها را در فرایند خود ذخیره میکند.

روش راه اندازی state server mode

 
  services.msc  را در  Run وارد کنید ، سپس  ASP.NET State Service را استارت کنید

به طور پیش فرض ASP.NET State Service در حالت manual است

 

    <sessionState mode="StateServer" customProvider="DefaultSessionProvider" stateConnectionString="tcpip=localhost:42424">  
      
    stateConnectionString="tcpip=localhost : 42424"  

Server Name/IP Port

StateConnectionstring اساسا از موارد زیر تشکیل میشود؛

Server/system  : در آن یک سرویس ASP.NET ویندوز در حال اجرا است.

Port : به طور پیش فرض ،  state service  ازTCP port 42424 که با استفاده از رجیستری قابل تنظیم است، پیروی میکند.

مزایای استفاده از State Server Mode:

 .1پردازش کننده  بازیافت (recycl) ،برروی متغییر داده session تاثیر ندارد .

 .2می توان درهمان وب سرور و یا دستگاه های مختلف اختصاص داده شده ، ذخیره کرد.

مشکلات State Server Mode

 .1راه اندازی مجدد sate service می تواند به از دست دادن session data منجر شود.

 .2آهسته تر از       است  proc mode  

 

SQL Server Session Mode

Session mode یک برنامه کاربردی  ASP.NET است ،که توسط SQL Server تعیین و سپس متغیرهای session را در دیتابیس SQL سرور ذخیره می کند. این حالت همچنین یک راه قابل اعتماد برای ذخیره داده ها session و حفظ مقادیر IIS یا وب سرور پس از راه اندازی مجدد است.

برای  ذخیره سازی متغیرهای session در یک پایگاه داده SQL سرور ما نیاز به یک دیتابیس  و جدول برای ذخیره ی داده ها داریم.

در مسیر: C:\Windows\Microsoft.NET\Framework64\v4.0.30319  یک فایل exe  بنام aspnet_regsql موجود است.

 سیستم عامل ویندوز  و نسخه ای از .NET Framework  بر روی دستگاه نصب شده را در نظر میگیریم .  در اینجا ، در ویندوز 7 و framework نسخه 4.0 نصب شده است.

رویه (Procedure):

Run و دستور cmd را تایپ میکنیم  و پس باز کردن یک پنجره فرمان cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319 cd را وارد کنید.

این به محلی که aspnet_regsql.exe  در آن است ،میرود.

ابزار را  با استفاده از فرمان زیراجرا نمایید .

 

.

 

Web Config

 تغییر حالت SQL Server و ارائه SQL connection string

    <sessionState mode="SQLServer"  customProvider="DefaultSessionProvider"   
                      sqlConnectionString="Data Source=abhishek-HP\devAbhi;integrated security=SSPI">  

پس از انجام همه تنظیمات  مورد نیاز ،در حال حاضر برنامه ما آماده ی اجرا با حالت SQL Server session است

مزایای استفاده از SQL Server Mode

 .1
گزینه ای بسیار امن و قابل اعتماد برایsession management 
Session data  .2
قادر به ادامه حیات پس از راه اندازی مجدد پردازش کننده ( worker process) یا state  راه اندازی مجدد سرویس ویندوز خواهد بود.
 .3
در مقایسه با حالت های دیگرمقیاس پذیرتر است.
 

معایب حالت SQL سرور

     .1عملکرد آهسته
     .2سربار برای serialization و deserialization  داده های پیچیده.

Application State

تعریف MSDN می گوید:  Application state  یک مخزن داده (data repository) در دسترس در تمام کلاسها ی برنامه ASP.NET است . بر خلاف session state ، که مخصوص به یک session کاربر، application state شامل تمام کاربران و session ها است .

Application state  در یک نمونه از کلاس HttpApplicationState ذخیره می شود. این کلاس یک دیکشنری است که اشیاء  key-value  را در معرض نمایش قرار میدهد .

متغیرهای Application state نیز برای ذخیره داده ها هنگامی که navigatiing  از یک صفحه به صفحه دیگر  ذخیره میشود ،استفاده می شود. چند کاربره بودن  Global data به  این معنیست که در تمام صفحات و تمام session ها در دسترس خواهد بود. متغیرهای Application state  بر روی وب سرور در حافظه پردازش کننده ASP.NET ، ذخیره می شود.

نمونه کد:

افزودن  داده ها در متغیرهای نرم افزار

    namespace Test  
    {  
        public partial class applicationState : System.Web.UI.Page  
        {  
            protected void Page_Load(object sender, EventArgs e)  
            {  
                if (!IsPostBack)  
                {  
                    if (Application["Counter"] == null)  
                    {  
                        Application["Counter"] = 0;  
                    }  
                    TextBox1.Text = Application["Counter"].ToString();  
      
                }  
            }  
      
            protected void Button1_Click(object sender, EventArgs e)  
            {  
                if (Application["Counter"] != null)  
                {  
                    int ApplicationCounter = (int)Application["Counter"] + 1;  
                    TextBox1.Text = ApplicationCounter.ToString();  
                    Application["Counter"] = ApplicationCounter;  
                }  
      
            }  
      
            protected void Button2_Click(object sender, EventArgs e)  
            {  
                Response.Redirect("ApplicationStateTest.aspx");  
            }  
        }  
    }  

خواندن داده ها از متغیرهای نرم افزار:

    namespace Test  
    {  
        public partial class ApplicationStateTest : System.Web.UI.Page  
        {  
            protected void Page_Load(object sender, EventArgs e)  
            {  
                if (Application["Counter"] != null)  
                {  
                    Label1.Text = Application["Counter"].ToString();  
                }  
            }  
        }  
    }  

یک متغیر application state  ، بر خلاف متغیرهای Session  زمان پیش فرضی ندارد. زمانی که فرایند hosting برنامه  دوباره راه اندازی شود و یا نرم افزار به پایان  رسد ، به پایان خواهند رسید.

داده های متغیر Application state ،قابل اعتماد برای web farms و یا گسترش نوع web garden نیست چرا که آنها در میان وب سرور ها یا پردازش کننده های متعدد بر روی همان دستگاه  هستند.

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

Web farm وضعیتی ست که در آن برنامه های تحت وب بر روی سرورهای مختلف با load balancer توسعه داده میشوند.

Web garden
: وضعیتیست  که در آن برنامه های تحت وب بر روی سرور با worker processes متعدد توسعه داده شده اند.

مزایای استفاده از application state

    .1 
از نرم افزار های  global data چند کاربری ذخیره شده در حافظه هستند.
    .2 
دسترسی آسان
   .3  بازیابی سریع

معایب  application state

 .1نرم افزار داده های متغیر(Application variable data) قادر به ادامه حیات برای راه اندازی مجدد IIS و بازیافت پردازش کننده نیست.

 .2برای webfarm  و webgarden مناسب نیست.

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

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید