آموزش ASP.Net

آموزش ASP.Net - مدیریت State

Hyper Text Transfer Protocol(منشور انتقال ابرمتن) یک پرورتکل ناپایدار (stateless) می باشد. هنگامی که سرویس گیرنده (client) ارتباط خود را با سرویس دهنده (server) قطع می کند، موتور  ASP.NET اشیاء page را دور می اندازد. از این طریق، هر برنامۀ تحت وبی قادر خواهد بود تا حدی گسترده شود که امکان سرویس دادن به چندین درخواست (request) به طور همزمان و بدون کم آوردن حافظه سرور فراهم آید.


با این حال باید مکانیزم یا تکنیکی وجود داشته باشد که از طریق آن اطلاعات بین درخواست ها (request) ذخیره گردیده و امکان بازیابی آن ها در صورت لزوم بوجود آید. این اطلاعات (مقادیر جاری کلیۀ کنترل ها و متغیرها ویژه ی کاربر جاری در session فعلی state ((وضعیت) خوانده می شود.


 ASP.NET  چهار نوع مختلف از state را مدیریت می کند که به شرح زیر می باشند:

  • View State
  • Control State
  • Session State
  • Application State


View State 


 View state  در اصل همان وضعیت صفحه و تمامی کنترل های آن می باشد. View state به صورت پیش فرض در تمامی post ها (صفحات ASP.NET ) فعال می باشد.

هنگامی که صفحه به سرویس گیرنده برگردانده می شود، تغییرات وارد آمده در خصوصیات (property) صفحه و کلیۀ کنترل های آن مشخص شده، سپس در فیلد پنهانی به نام _VIEWSTATE ذخیره می گردد. هنگامی که صفحه دوباره post back می شود، فیلد _VIEWSTATE به همراه HTTP request به سرویس دهنده ارسال می گردد.

View state را می توان برای موارد زیر فعال یا غیر فعال ساخت:

 

  • تمام برنامه، این کار را می توان با متصل کردن خاصیت EnableViewState به بخش<page>  فایلconfig  انجام داد.
  • برای یک صفحه، از طریق مقداردهی خصیصه ی EnableViewState Page directive)) به صورت زیر:
<%@ Page Language="C#" EnableViewState="false" %>
  • برای یک کنترل. کافی است خاصیت EnableViewState را متصل کنید.


این روش با استفاده از یک view state توسط کلاس StateBag است که مجموعه ای از آیتم های view state را تعریف می کند، اجرا می شود. state bag  یک ساختار داده ای دربردارندۀ جفت های خصیصه و مقدار (attribute value pairs) می باشد که به صورت رشته های متصل و مرتبط با اشیاء ذخیره می گردند.


کلاس statebag دارای خواص زیر می باشد:

خواص

شرح

Item(name)

این خاصیت مقدار (value) آیتمی که در شئ StateBag ذخیره گردیده را گرفته و تنظیم می کند. این خاصیت در حقیقت property پیش فرض کلاس StateBag محسوب می شود.

Count

این خاصیت تعداد آیتم های موجود در مجموعه ی (collection) view state را برمی گرداند و یا به عبارت دیگر تعداد اشیاء StateItem موجود در شئ Statebag را برمی گرداند.

Keys

مجموعه یا آرایه ای (collection) از کلید ها (اسم خواص یا property های کنترل مربوطه) که نشانگر آیتم های داخل شئ StateBag است، بر می گرداند.

Values

مجموعه ای از مقادیر view- state که در شئ StateBag ذخیره شده است را برمی گرداند.

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

متدها

شرح

Add(name, value)

یک شئ StateItem به شئ StateBag اضافه می کند. چنانچه آیتم مورد نظر از پیش در شئ StateBag موجود باشد، تابع Add مقدار آن آیتم را بروز رسانی می کند.

Clear

این متد کلیه ی آیتم ها را از شئ StateBag جاری حذف می کند.

Equals(Object)

این تابع تعیین می کند آیا شئ مشخص شده با شئ جاری برابر یا یکسان هست یا خیر.

Finalize

این تابع به شئ امکان می دهد منابع را آزاد ساخته و پیش از اینکه توسط garbage collection   (فرایند زباله روبی) بازگرفته یا احیاء شود دیگر عملیات پاک سازی (cleanup operation) را اجرا کند.

GetEnumerator

 

این متد یک شمارنده (enumerator) برمی گرداند که تمامی جفت های کلید/مقدار اشیاء StateItem (ذخیره شده در شئ StateBag) را تکرار (iterate) می کند.

GetType

متد GetType نوع (type) نمونه یا instance جاری را بازمی گرداند.

IsItemDirty

شئ StateItem که در شئ StateBag ذخیره گردیده را بررسی می کند تا از این طریق ارزیابی کند آیا شئ StateItem اصلاح (modify) شده است یا خیر.

Remove(name)

تابع Remove آیتم مشخص شده را حذف می کند.

SetDirty

شئ StateItem که در شئ StateBag ذخیره گردیده را بررسی می کند تا از این طریق ارزیابی کند آیا شئ StateItem اصلاح (modify) شده است یا خیر.

SetItemDirty

Dirtyproperty آیتم مشخص شده را در statebag تنظیم می کند.

ToString

تابع ToString شئ state bag را به صورت رشته باز می گرداند.

 

مثال

مثال زیر مفهوم ذخیره سازی view state را نمایش می دهد. یک شمارش گر (counter) در نظر می گیریم که با هر بار postback (و کلیک یک دکمه روی صفحه) یک واحد افزایش می یابد. یک کنترل label  مقدار مربوطه را در شمارش گر نمایش می دهد.

 

کد  Markup fileبه شرح زیر می باشد:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

   <head runat="server">
      <title>
         Untitled Page
      </title>
   </head>
   
   <body>
      <form id="form1" runat="server">
      
         <div>
            <h3>View State demo</h3>
         
            Page Counter:
            
            <asp:Label ID="lblCounter" runat="server" />
            <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" />
         </div>
         
      </form>
   </body>
   
</html>

فایل Code-behind  برای مثال به شرح زیر است:

public partial class _Default : System.Web.UI.Page
{
   public int counter
   {
      get
      {
         if (ViewState["pcounter"] != null)
         {
            return ((int)ViewState["pcounter"]);
         }
         else
         {
            return 0;
         }
      }
      
      set
      {
         ViewState["pcounter"] = value;
      }
   }
        
   protected void Page_Load(object sender, EventArgs e)
   {
      lblCounter.Text = counter.ToString();
      counter++;
   }
}

نتیجۀ زیر بدست می آید:

view state demo

 

Control State


نمی توان به صورت مستقیم به Control stateدسترسی پیدا کرده، آن را اصلاح و یا غیر فعال ساخت.

 

Session State

هنگامی که کاربر به یک وب سایت ASP.NET وصل می شود، در همان زمان یک شئ جدید session ایجاد می گردد. همچنین هنگامی که session state فعال سازی می شود، یک شئ session state ویژه ی هر درخواست (request) ساخته می شود. شئ session state ایجاد شده در واقع به بخشی از context یا متن تبدیل شده و از طریق صفحه قابل دسترسی می باشد.

Session state عموما به منظور ذخیره سازی اطلاعات و داده های اپلیکیشن همچون inventory (لیست موجودی)، تهیه کننده، سبد خرید و رکورد مشتری بکار می رود. همچنین می تواند اطلاعاتی دربارۀ  کاربر، تمایلات وی و عملیات معلق (pending operation) در خود نگه دارد.

Session ها به وسیلۀ یک sessionID (شناسۀ session ) شناسایی و ردگیری (trace) می شوند که از کلاینت به سرور ارسال شده و سپس به صورت کوکی یا یک URL اصلاح شده برگردانده می شوند. لازم به ذکر است که sessionID منحصر بفرد بوده و علاوه بر آن کاملاً تصادفی می باشد.

شئ session state از کلاس HttpSessionState مشتق و ساخته شده است که مجموعه ای (collection) از آیتم های session state را تعریف می کند.

کلاس HttpSessionState دارای خواص زیر می باشد:

خواص

شرح

SessionID

شناسه ی منحصر بفرد ویژه ی session مورد نظر را باز می گرداند.

Item(name)

مقدار آیتم SessionState با نام مشخص شده است. این امر ویژگی پیش فرض کلاس HttpSessionState می باشد

Count

تعداد آیتم های درون session state collection را برمی گرداند.

TimeOut

این خاصیت مقدار زمانی (حداکثر زمان ممکن) که می تواند مابین درخواست ها پیش از اینکه ASP.NET آن session را خاتمه دهد، سپری شود را بر حسب دقیقه تنظیم می کند.

متدها کلاس فوق با ذکر شرح آن ها در جدول زیر برای شما لیست شده اند:

متدها

شرح

Add(name, value)

این تابع یک آیتم جدید به session state collection اضافه می کند.

Clear

کلیۀ آیتم ها را از session state collection حذف می کند.

Remove(name)

به وسیله ی این متد می توان تنها آیتم مشخص شده را از session state collection پاک کرد.

RemoveAll

این متد کلیه ی کلید ها و مقادیر را از session-state collection حذف می کند.

RemoveAt

آیتمی که دارای ایندکس مشخص شده می باشد را حذف می کند.

 

شئ session state یک جفت اسم-مقدار (name-value pair) می باشد که با استفاده از آن می توان اطلاعاتی را ذخیره کرده و از شئ state object بازیابی کرد. از کد زیر می توانید برای همین منظور بهره بگیرید:

void StoreSessionInfo()
{
   String fromuser = TextBox1.Text;
   Session["fromuser"] = fromuser;
}

void RetrieveSessionInfo()
{
   String fromuser = Session["fromuser"];
   Label1.Text = fromuser;
}

همان طور که مشاهده می کنید کد فوق تنها رشته ها را در Session dictionary objectذخیره می کند. با این حال قادر است کلیۀ نوع داده های اولیه (primitive data type) و آرایه های متشکل از نوع داده های اولیه و همچنین DataSet، DataTable، HashTableو اشیاء image و هر کلاس دیگری که توسط کاربر تعریف شده و از شئ ISerializable به ارث می برد را در خود ذخیره و نگه داری کند.

 

مثال

مثال ذیل مفهوم ذخیره سازی session state را شرح می دهد. در این مثال از دو دکمه روی صفحه به اضافۀ یک text box به منظور وارد کردن رشته و همچنین یک label ویژۀ نمایش دادن نوشته که از session  قبل ذخیره شده و باقی مانده استفاده می شود.

کد  Markup fileبه شرح زیر می باشد:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

   <head runat="server">
      <title>
         Untitled Page
      </title>
   </head>
   
   <body>
      <form id="form1" runat="server">
         <div>
            &nbsp; &nbsp; &nbsp;
            
            <table style="width: 568px; height: 103px">
            
               <tr>
                  <td style="width: 209px">
                     <asp:Label ID="lblstr" runat="server" Text="Enter a String"  style="width:94px">
                     </asp:Label>
                  </td>
					
                  <td style="width: 317px">
                     <asp:TextBox ID="txtstr" runat="server" style="width:227px">
                     </asp:TextBox>
                  </td>
               </tr>
	
               <tr>
                  <td style="width: 209px"> </td>
                  <td style="width: 317px"> </td>
               </tr>
	
               <tr>
                  <td style="width: 209px">
                     <asp:Button ID="btnnrm" runat="server" 
                        Text="No action button" style="width:128px" />
                  </td>
	
                  <td style="width: 317px">
                     <asp:Button ID="btnstr" runat="server" 
                        OnClick="btnstr_Click" Text="Submit the String" />
                  </td> 
               </tr>
	
               <tr>
                  <td style="width: 209px">  </td>
	
                  <td style="width: 317px">  </td>  
               </tr>
	
               <tr>
                  <td style="width: 209px">
                     <asp:Label ID="lblsession" runat="server"  style="width:231px"  >
                     </asp:Label>
                  </td>
	
                  <td style="width: 317px">  </td>
               </tr>
	
               <tr>
                  <td style="width: 209px">
                     <asp:Label ID="lblshstr" runat="server">
                     </asp:Label>
                  </td>
	
                  <td style="width: 317px">  </td>
               </tr>
               
            </table>
            
         </div>
      </form>
   </body>
</html>

کد فوق هنگامی که پیاده سازی می شود در design view ظاهری مشابه تصویر زیر خواهد داشت:

session design view

فایل Code-behind  برای مثال به شرح زیر است:

public partial class _Default : System.Web.UI.Page 
{
   String mystr;
   
   protected void Page_Load(object sender, EventArgs e)
   {
      this.lblshstr.Text = this.mystr;
      this.lblsession.Text = (String)this.Session["str"];
   }
   
   protected void btnstr_Click(object sender, EventArgs e)
   {
      this.mystr = this.txtstr.Text;
      this.Session["str"] = this.txtstr.Text;
      this.lblshstr.Text = this.mystr;
      this.lblsession.Text = (String)this.Session["str"];
   }
}

حال فایل را اجرا کرده و نتیجه ی آن را مشاهده کنید:

session run view

Application state

تکنولوژی Asp.Net این اجازه را به شما می دهد تا مقادیر را به وسیله قابلیت Application State که مشتق شده از کلاس HTTP Application State است ، برای هر برنامۀ تحت وب فعال ، نگهداری کنید. Application State، یک حافظه سراسری یا عمومی ( Global ) بوده که از طریق تمامی صفحات برنامه وب قابل دسترسی است. بنابراین حافظه برای نگهداری اطلاعات عمومی و اطلاعاتی که باید در هر بار ارسال صفحات به سرور مورد استفاده قرار بگیرد، مناسب است. Application State در زوج های نام / مقدار، برای هر درخواست به یک آدرس مشخص URL ایجاد می شوند.


اپلیکیشن ASP.NET در واقع مجموعه ای از تمامی صفحات وب، کدها و دیگر فایل های داخل تک پوشه ی مجازی قرار گرفته بر روی server است. پس از اینکه که اطلاعات در application state ذخیره می شوند، این اطلاعات در اختیار همۀ کاربرها قرار می گیرند.

برای اینکه اطلاعات مذکور برای استفادۀ application state آماده شوند، ASP.NET  یک شئ application state  ویژۀ هر یک از اپلیکیشن ها، از کلاس HTTPApplicationState ایجاد کرد سپس شئ ایجاد شده را داخل حافظۀ سرور ذخیره می کند. این شئ توسط class file global.asax نمایش داده می شود.

 Application state  عمدتا جهت ذخیره سازی داده های آماری، داده های دریافتی از اپلیکیشن های عمومی مانند نرخ مالیات، نرخ نزول و حساب تعداد کاربرهایی که از سایت بازدید می کنند و غیره بکار می رود.


کلاس HttpApplicationState دارای خواص زیر می باشد:

خاصیت

شرح

Item(name)

 

Count

 

متد کلاس HttpApplicationState به شرح زیر می باشد:

متد

شرح

Add(name, value)

ایتمی را با کلید مشخص شده و مقدار شده در application قرار می دهد.

Clear

به وسیلۀ این تابع می توان تمامی آیتم ها را از مجموعه (collection) application state  حذف کرد.

Remove(name)

آیتم مورد نظر (مشخص شده) را حذف می کند.

RemoveAll

تمامی اشیاء را ازcollection HttpApplicationState حذف می کند.

RemoveAt

بر اساس اندیس ورودی object ای را که در جایگاه مورد نظر قرار دارد حذف می نماید.

Lock()

روی application state collection قفل گذاشته تا تنها کاربر جاری بتواند به صورت exclusiveبه آن دسترسی داشته باشد.

Unlock()

این تابع application state collection را از حالت قفل در آورده تا همۀ کاربران بتوانند به آن دسترسی داشته باشند.

 

داده های Application state معمولا توسط نوشتن handlerها برای رویدادها نگهداری می شوند: 

  • Application_Start
  • Application_End
  • Application_Error
  • Session_Start
  • Session_End

 

تکه کد زیر دستور نگارش (syntax) لازم برای ذخیره سازی اطلاعات application state را نمایش می دهد:

Void Application_Start(object sender, EventArgs e)
{
   Application["startMessage"] = "The application has started.";
}

Void Application_End(object sender, EventArgs e)
{
   Application["endtMessage"] = "The application has ended.";
}
در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش ASP.Net

Learn ASP.Net

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

کلیک کنید و سوالات خود را از ما بپرسید
لطفا فرم سوال را پر کنید

سوال شما با موفقیت ثبت شد. برای اینکه بتوانیم به شما اطلاع رسانی کنیم، موارد زیر را وارد کنید:

لطفا چند لحظه منتظر بمانید ...