ASP.NET Managing State Sessions- إدارة الحالة الجلسات في برمجة صفحات الويب آي إس بي

 ASP.NET Managing State-

  إدارة الحالة في برمجة صفحات الويب آي إس بي


 

 ASP.NET Managing State-  إدارة الحالة في برمجة صفحات الويب آي إس بي 

 بروتوكول نقل النصوص التشعبية (HTTP) هو بروتوكول  يخص الحالة الغير موجودة بمعني اذا لم توجد جلسة بين جهاز العميل السيرفر سيتوقف الإرسال .  عندما ينقطع العميل عن الخادم ، يتجاهل مشغل ASP.NET كائنات الصفحة.  وبهذه الطريقة ، يمكن لكل تطبيق ويب رفع حجمه لتقديم طلبات عديدة في وقت واحد دون نفاد ذاكرة الخادم.
 ومع ذلك ، يجب أن يكون هناك بعض التقنية لتخزين المعلومات بين الطلبات واستعادتها عند الاقتضاء.  هذه المعلومات ، أي القيمة الحالية لجميع عناصر التحكم والمتغيرات للمستخدم الحالي في الجلسة الحالية تسمى الحالة او الجلسات .
ASP.NET manages four types of states: 
اي اس بي تعالج ٤ انواع من الحالات او الجلسات 
  • View State حالة العرض
  • Control State حالة التحكم 
  • Session State حالة الجلسة 
  • Application State حالة التطبيق  

View State حالة العرض

حالة العرض هي حالة الصفحة وجميع عناصر التحكم الخاصة بها.  يتم الاحتفاظ به تلقائيًا عبر المشاركات بواسطة إطار عمل ASP.NET.
عند إرسال صفحة مرة أخرى إلى العميل ، يتم تحديد التغيير في خصائص الصفحة وعناصر التحكم بها وتخزينها في قيمة حقل إدخال مخفي باسم _VIEWSTATE.  عند إعادة نشر الصفحة ، يتم إرسال الحقل _VIEWSTATE إلى الخادم مع طلب HTTP.

 يمكن تمكين حالة العرض أو تعطيلها من أجل:
  • The entire application على مستوى التطبيق 
  • عن طريق تعيين خاصية EnableViewState في قسم من ملف web.config.
  •  A page على مستوى الصفحة 
  •  عن طريق تعيين سمة EnableViewState لتوجيه الصفحة ، إذا <٪ @ Page Language = "C #" EnableViewState = "false"٪>
  • A control  على مستوى الأداة 
  • عن طريق تعيين الخاصية Control.EnableViewState.
     يتم تنفيذه باستخدام كائن حالة عرض تم تعريفه بواسطة فئة StateBag والذي يحدد مجموعة من عناصر حالة العرض.  حقيبة الحالة عبارة عن بنية بيانات تحتوي على أزواج قيمة السمات المخزنة كسلسلة مرتبطة بالكائنات.
     فئة StateBag لها الخصائص التالية:
الخاصيةالوصف
Item(name)قيمة عنصر حالة المشاهدة بالاسم المحدد.  هذه هي الخاصية الافتراضية لفئة StateBag.
Countعدد العناصر في مجموعة حالة المشاهدة.
Keysمجموعة من المفاتيح لجميع العناصر في المجموعة.
Valuesمجموعة من القيم لجميع العناصر في المجموعة.
الدوال التالية خاصة بالفئة المسماة بحقيبةالحالة.
The StateBag class has the following methods:
الدالةالوصف
Add(name, value)لإضافة عنصر إلى مجموعة حالة العرض ويتم تحديث العنصر الموجود.
Clearيزيل كل العناصر من المجموعة.
Equals(Object)لتحديد ما إذا كان الكائن المحدد يساوي الكائن الحالي.
Finalizeيسمح بتحرير الموارد وإجراء عمليات التنظيف الأخرى.
GetEnumeratorإرجاع عداد يتكرر على جميع أزواج المفاتيح / القيمة لكائنات StateItem المخزنة في كائن StateBag.
GetTypeالحصول على نوع المثيل الحالي.
IsItemDirtyيتحقق من كائن StateItem المخزن في كائن StateBag لتقييم ما إذا كان قد تم تعديله أم لا.
Remove(name)يزيل العنصر المحدد.
SetDirtyيضبط حالة كائن StateBag وكذلك خاصية Dirty لكل من كائنات StateItem الموجودة به.
SetItemDirtyيعين الخاصية Dirty لكائن StateItem المحدد في كائن StateBag.
ToStringإرجاع سلسلة تمثل كائن حقيبة الحالة.

مثال Example

يوضح المثال التالي مفهوم تخزين حاله العرض. دعوانا نحافظ علي العداد ، والذي يتزايد في كل مره يتم فيها نشر الصفحة مره أخرى عن طريق النقر علي زر علي الصفحة. يظهر عنصر تحكم التسمية القيمة في العداد.


كود ملف الهتيمل  كما يلي:


 كود الملف  كالتالي:


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



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

    runat="server">
      </span><span class="pln" style="color: rgb(0, 0, 0);">
         Untitled Page
      </span><span class="tag" style="color: rgb(0, 0, 136);">
   
   
   
      
id="form1" runat="server">

View State demo
Page Counter: ID="lblCounter" runat="server" /> ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" />
ملاحظة عند بناء صفحة ويب في فيجوال استديو يتم انشاء ملفين الأول خاص بالواجهة الرسومية ويتم استخدام في كود الأدوات مثل مربع النص او الأزرار وهو كود النص التشعبي 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++;
   }
}
ناتج الكود:
View State Demo

حالة الأداة Control State

لا يمكن تعديل حالة التحكم أو الوصول إليها مباشرة أو تعطيلها.

 حالة الجلسة Session State

عندما يتصل المستخدم بموقع ويب ASP.NET ، يتم إنشاء كائن جلسة عمل جديد.  عند تشغيل حالة الجلسة ، يتم إنشاء كائن حالة جلسة جديد لكل طلب جديد.  يصبح كائن حالة الجلسة هذا جزءًا من السياق وهو متاح من خلال الصفحة.
 تستخدم حالة الجلسة عمومًا لتخزين بيانات التطبيق مثل المخزون أو قائمة الموردين أو سجل العملاء أو عربة التسوق.  يمكنه أيضًا الاحتفاظ بمعلومات حول المستخدم وتفضيلاته ، وتتبع العمليات المعلقة.
 يتم تحديد الجلسات وتتبعها باستخدام SessionID 120 بت ، والذي يتم تمريره من العميل إلى الخادم والعودة كملف تعريف ارتباط أو عنوان URL معدل.  تعتبر SessionID فريدة وعشوائية على مستوى العالم.
يتم إنشاء كائن حالة جلسة العمل من فئة HttpSessionState ، والتي تحدد مجموعة من عناصر حالة الجلسة.
 فئة HttpSessionState لها الخصائص التالية:
الخاصية الوصف 
SessionIDمعرف جلسة فريد.
Item(name)قيمة عنصر حالة الجلسة بالاسم المحدد.  هذه هي الخاصية الافتراضية للفئة HttpSessionState.
Count.عدد العناصر في مجموعة حالة الجلسة
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.

مثال Example


يوضح المثال التالي مفهوم حالة جلسة .  يوجد زران على الصفحة ، مربع نص لإدخال السلسلة وتسمية لعرض النص المخزن من الجلسة الأخيرة.

 كود ملف الترميز كالتالي:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default"  %>



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

    runat="server">
      </span><span class="pln" style="color: rgb(0, 0, 0);">
         Untitled Page
      </span><span class="tag" style="color: rgb(0, 0, 136);">
   
   
   
      
id="form1" runat="server">
      style="width: 568px; height: 103px">
style="width: 209px"> ID="lblstr" runat="server" Text="Enter a String" style="width:94px"> style="width: 317px"> ID="txtstr" runat="server" style="width:227px">

style="width: 209px">
style="width: 317px"> style="width: 209px"> ID="btnnrm" runat="server" Text="No action button" style="width:128px" /> style="width: 317px"> ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> style="width: 209px"> style="width: 317px"> style="width: 209px"> ID="lblsession" runat="server" style="width:231px" > style="width: 317px"> style="width: 209px"> ID="lblshstr" runat="server"> style="width: 317px">

ناتج كود الهتيمل 
session design view
 الكود البرمجي The code behind file is given here:
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"];
   }
}
تنفيذ الكود
Execute the file and observe how it works:
session run view

حالة التطبيق Application State

تطبيق ASP.NET عبارة عن مجموعة من جميع صفحات الويب والرمز والملفات الأخرى داخل دليل ظاهري واحد على خادم ويب.  عند تخزين المعلومات في حالة التطبيق ، تكون متاحة لجميع المستخدمين.

 لتوفير استخدام حالة التطبيق ، يقوم ASP.NET بإنشاء كائن حالة تطبيق لكل تطبيق من فئة HTTPApplicationState ويخزن هذا الكائن في ذاكرة الخادم.  يتم تمثيل هذا الكائن بواسطة ملف فئة global.asax.

 تستخدم حالة التطبيق في الغالب لتخزين عدادات الدخول والبيانات الإحصائية الأخرى وبيانات التطبيق العالمية مثل معدل الضريبة ومعدل الخصم وما إلى ذلك ولتتبع المستخدمين الذين يزورون الموقع.

 فئة HttpApplicationState لها الخصائص التالية:
الخاصية الوصف
Item(name)قيمة عنصر حالة التطبيق بالاسم المحدد.  هذه هي الخاصية الافتراضية للفئة HttpApplicationState.

Countعدد العناصر في مجموعة حالة التطبيق.

فئة HttpApplicationState لديها الدوال التالية:

دالةالوصف
Add(name, value)يضيف عنصرًا إلى مجموعة حالة التطبيق.

Clearيزيل كل العناصر من مجموعة حالة التطبيق.

Remove(name)يزيل العنصر المحدد من مجموعة حالة التطبيق.

RemoveAllيزيل كل الكائنات من مجموعة HttpApplicationState.

RemoveAtيزيل كائن HttpApplicationState من مجموعة حسب الفهرس.

Lock()لإغلاق مجموعة حالة التطبيق بحيث يمكن للمستخدم الحالي فقط الوصول إليها.

Unlock()يفتح مجموعة حالة التطبيق حتى يتمكن جميع المستخدمين من الوصول إليها.

يتم الاحتفاظ بشكل عام ببيانات حالة التطبيق عن طريق كتابة معالجات للأحداث:

  • Application_Start بداية التطبيق 
  • Application_End نهاية التطبيق 
  • Application_Error أخطاء التطبيق
  • Session_Start بداية الجلسة
  • Session_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.";
}