ASP.NET - ایالت مدیریت

پروتکل انتقال ابر متن (HTTP) یک پروتکل بدون حالت است. وقتی کلاینت از سرور قطع می شود، موتور ASP.NET اشیاء صفحه را دور می زند. به این ترتیب، هر برنامه وب می‌تواند برای ارائه درخواست‌های متعدد به طور همزمان، بدون اینکه حافظه سرور تمام شود، افزایش یابد.با این حال، باید تکنیکی برای ذخیره اطلاعات بین درخواست‌ها و بازیابی آن در صورت لزوم وجود داشته باشد. این اطلاعات یعنی مقدار فعلی همه کنترل‌ها و متغیرها برای کاربر فعلی در جلسه جاری State نامیده می‌شود.ASP.NET چهار نوع حالت را مدیریت می کند:مشاهده وضعیتحالت کنترلوضعیت جلسهوضعیت برنامهمشاهده وضعیتحالت view وضعیت صفحه و تمام کنترل های آن است. این به طور خودکار در سراسر پست توسط چارچوب ASP.NET نگهداری می شود.هنگامی که یک صفحه به مشتری ارسال می شود، تغییرات در ویژگی های صفحه و کنترل های آن تعیین می شود و در مقدار یک فیلد ورودی مخفی به نام _VIEWSTATE ذخیره می شود. هنگامی که صفحه دوباره ارسال شد، فیلد _VIEWSTATE با درخواست HTTP به سرور ارسال می شود.وضعیت view را می توان برای موارد زیر فعال یا غیرفعال کرد:کل برنامه با تنظیم ویژگی EnableViewState در بخش <pages> فایل web.config.صفحه ای با تنظیم ویژگی EnableViewState دستورالعمل Page، به عنوان <%@ Page Language="C#" EnableViewState="false" %>یک کنترل با تنظیم ویژگی Control.EnableViewState.با استفاده از یک شیء حالت view تعریف شده توسط کلاس StateBag که مجموعه ای از آیتم های حالت view را تعریف می کند، پیاده سازی می شود. کیسه حالت یک ساختار داده حاوی جفت ارزش ویژگی است که به عنوان رشته های مرتبط با اشیا ذخیره می شود.کلاس StateBag دارای ویژگی های زیر است:توضیحات خواصItem(name) مقدار مورد حالت view با نام مشخص شده. این ویژگی پیش فرض کلاس StateBag است.شمارش تعداد موارد موجود در مجموعه حالت view.کلیدها مجموعه ای از کلیدها برای همه موارد موجود در مجموعه.ارزش ها مجموعه ای از مقادیر برای همه موارد موجود در مجموعه.کلاس StateBag متدهای زیر را دارد:شرح روشهاافزودن (نام، مقدار) یک مورد را به مجموعه حالت view اضافه می کند و مورد موجود به روز می شود.Clear همه موارد را از مجموعه حذف می کند.Equals(Object) تعیین می کند که آیا شی مشخص شده با شی فعلی برابر است یا خیر.Finalize به آن اجازه می دهد منابع را آزاد کند و سایر عملیات پاکسازی را انجام دهد.GetEnumerator شمارشگری را برمی‌گرداند که روی تمام جفت‌های کلید/مقدار اشیاء StateItem ذخیره شده در شی StateBag تکرار می‌شود.GetType نوع نمونه فعلی را دریافت می کند.IsItemDirty یک شی StateItem ذخیره شده در شی StateBag را بررسی می کند تا بررسی کند که آیا تغییر یافته است یا خیر.Remove(name) مورد مشخص شده را حذف می کند.SetDirty وضعیت شی StateBag و همچنین ویژگی Dirty هر یک از اشیاء StateItem موجود در آن را تنظیم می کند.SetItemDirty ویژگی Dirty را برای شی StateItem مشخص شده در شی StateBag تنظیم می کند.ToString رشته ای را برمی گرداند که نشان دهنده شی کیسه حالت است.مثالمثال زیر مفهوم ذخیره سازی حالت نمایش را نشان می دهد. اجازه دهید یک شمارنده نگه داریم که هر بار که صفحه به عقب ارسال می شود با کلیک کردن بر روی دکمه ای در صفحه افزایش می یابد. یک کنترل برچسب مقدار را در شمارنده نشان می دهد.کد فایل نشانه گذاری به شرح زیر است:<%@ 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" ="btnIncrement_Click" /> </div> </form> </body> </html>کد پشت فایل برای مثال در اینجا نشان داده شده است: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++; }}حالت کنترلوضعیت کنترل را نمی توان تغییر داد، مستقیماً به آن دسترسی پیدا کرد یا غیرفعال کرد.وضعیت جلسههنگامی که یک کاربر به یک وب سایت ASP.NET متصل می شود، یک شی جلسه جدید ایجاد می شود. هنگامی که وضعیت جلسه روشن است، برای هر درخواست جدید یک شیء وضعیت جلسه جدید ایجاد می شود. این شیء وضعیت جلسه بخشی از متن می شود و از طریق صفحه در دسترس است.حالت جلسه معمولاً برای ذخیره داده های برنامه مانند موجودی، لیست تامین کنندگان، سوابق مشتری یا سبد خرید استفاده می شود. همچنین می تواند اطلاعات کاربر و ترجیحات او را حفظ کند و عملیات در حال انتظار را پیگیری کند.جلسات با یک SessionID 120 بیتی شناسایی و ردیابی می شوند که از کلاینت به سرور منتقل می شود و به عنوان کوکی یا URL تغییر یافته باز می گردد. SessionID در سطح جهانی منحصر به فرد و تصادفی است.شیء وضعیت جلسه از کلاس HttpSessionState ایجاد می شود که مجموعه ای از آیتم های وضعیت جلسه را تعریف می کند.کلاس HttpSessionState دارای ویژگی های زیر است:توضیحات خواصSessionID شناسه منحصر به فرد جلسه.Item(name) مقدار آیتم حالت جلسه با نام مشخص شده. این ویژگی پیش فرض کلاس HttpSessionState است.شمارش تعداد موارد موجود در مجموعه حالت جلسه.TimeOut مقدار زمان مجاز بین درخواست‌ها را قبل از پایان دادن به جلسه توسط ارائه‌دهنده وضعیت جلسه دریافت و تنظیم می‌کند.کلاس HttpSessionState متدهای زیر را دارد:شرح روشهاAdd(name, value) آیتمی را به مجموعه وضعیت جلسه اضافه می کند.Clear تمام موارد را از مجموعه وضعیت جلسه حذف می کند.Remove(name) آیتم مشخص شده را از مجموعه وضعیت جلسه حذف می کند.RemoveAll تمام کلیدها و مقادیر را از مجموعه وضعیت جلسه حذف می کند.RemoveAt یک مورد را در یک فهرست مشخص از مجموعه وضعیت جلسه حذف می کند.شیء وضعیت جلسه یک جفت نام-مقدار برای ذخیره و بازیابی برخی اطلاعات از شیء وضعیت جلسه است. برای همین می توانید از کد زیر استفاده کنید:void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}کد بالا فقط رشته‌ها را در شی دیکشنری Session ذخیره می‌کند، با این حال، می‌تواند تمام انواع داده‌های اولیه و آرایه‌های متشکل از انواع داده‌های اولیه، و همچنین اشیاء DataSet، DataTable، HashTable و Image و همچنین هر کاربر را ذخیره کند. کلاس تعریف شده ای که از شی ISerializable به ارث می برد.مثالمثال زیر مفهوم ذخیره‌سازی وضعیت جلسه را نشان می‌دهد. دو دکمه در صفحه وجود دارد، یک کادر متن برای وارد کردن رشته و یک برچسب برای نمایش متن ذخیره شده از جلسه گذشته.کد فایل علامت گذاری به صورت زیر است:<%@ 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" ="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>در نمای طراحی باید به شکل زیر باشد:کد پشت فایل در اینجا آورده شده است: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"]; }}فایل را اجرا کنید و نحوه عملکرد آن را مشاهده کنید:وضعیت برنامهبرنامه ASP.NET مجموعه ای از تمام صفحات وب، کدها و فایل های دیگر در یک دایرکتوری مجازی در یک وب سرور است. هنگامی که اطلاعات در حالت برنامه ذخیره می شود، برای همه کاربران در دسترس است.برای فراهم کردن امکان استفاده از وضعیت برنامه، ASP.NET یک شیء حالت برنامه برای هر برنامه از کلاس HTTPApplicationState ایجاد می کند و این شی را در حافظه سرور ذخیره می کند. این شی با فایل کلاس global.asax نمایش داده می شود.Application State بیشتر برای ذخیره شمارنده های آماری و سایر داده های آماری، داده های جهانی برنامه مانند نرخ مالیات، نرخ تخفیف و غیره و برای حفظ ردیابی کاربرانی که از سایت بازدید می کنند استفاده می شود.کلاس HttpApplicationState دارای ویژگی های زیر است:توضیحات خواصItem(name) مقدار مورد دولت برنامه با نام مشخص شده. این ویژگی پیش فرض کلاس HttpApplicationState است.شمارش تعداد موارد موجود در مجموعه حالت برنامه.کلاس HttpApplicationState متدهای زیر را دارد:شرح روشهاAdd(name, value) یک مورد را به مجموعه حالت برنامه اضافه می کند.Clear همه موارد را از مجموعه حالت برنامه حذف می کند.Remove(name) آیتم مشخص شده را از مجموعه حالت برنامه حذف می کند.RemoveAll تمام اشیاء را از مجموعه HttpApplicationState حذف می کند.RemoveAt یک شی HttpApplicationState را از مجموعه بر اساس فهرست حذف می کند.Lock() مجموعه حالت برنامه را قفل می کند تا فقط کاربر فعلی بتواند به آن دسترسی داشته باشد.Unlock() مجموعه حالت برنامه را باز می کند تا همه کاربران بتوانند به آن دسترسی داشته باشند.داده‌های وضعیت برنامه عموماً توسط کنترل‌کننده‌های نوشتن برای رویدادها نگهداری می‌شوند:Application_StartApplication_Endخطای برنامهSession_StartSession_Endقطعه کد زیر دستور اولیه برای ذخیره اطلاعات وضعیت برنامه را نشان می دهد: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.";}