مدیریت state- ASP.NET

کاربرای عزیز ، وقت شما بخیر، امیدوارم که از مطالبی که در خصوص asp  گذاشته ایم بهره برده باشید. این بار میخواهیم در زمینه مدیریت state در Asp  باهم بیاموزیم.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) فعال می باشد.

ViewState وضعیت و اطلاعات تمامی اجزا و المان های فرم را در قالب فیلدهای پنهانی که داخل یک فرم با خاصیت ” runat = ” server  قرار دارد، نگهداری می کند.

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

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

برای کل برنامه، این کار را می توان با متصل کردن خاصیت EnableViewState به بخش <pages> فایل web.config انجام داد.

برای یک صفحه، از طریق مقداردهی خصیصه ی EnableViewState Page directive)) به صورت زیر:

<%@Page Language=”C#” EnableViewState=”false” %>

برای یک کنترل. کافی است خاصیت EnableViewState را متصل کنید.

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 آیتم مشخص شده را حذف می کند.

SetItemDirty

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

ToString

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

مثال:

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

Markup file code:

<%@ 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;

}

}

}

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

clip_image001

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 مورد نظر را باز می گرداند.

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”].ToString();

Label1.Text = fromuser;

}

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

مثال:

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

Markup file code:

<%@ 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>

<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 ظاهری مشابه تصویر زیر خواهد داشت:

clip_image002

Code behind file:

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”];

}

}

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

clip_image003

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 دارای خواص زیر می باشد:

خاصیت (property)

شرح

Item(name)

بر اساس کلیدی که به عنوان آرگومان به آن پاس می دهیم آیتمی را از collection مورد دسترسی قرار می دهد.

Count

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

توابع کلاس 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.”;

}