إدارة جلسات ASP.NET [مثال]

⚡ ملخص ذكي

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

  • 🌐 بروتوكول HTTP عديم الحالة: لا يحتفظ بروتوكول HTTP بالبيانات بين الطلبات، لذلك يضيف ASP.NET آليات للحفاظ على الحالة.
  • 🗂️ حالة العرض: تقوم خاصية ViewState بنقل قيم التحكم تلقائيًا من صفحة إلى أخرى.
  • 🔑 كائن الجلسة: تقوم Session[“Key”] بتخزين واسترجاع أزواج المفاتيح والقيم طوال دورة حياة التطبيق.
  • ⚙️ أوضاع الحالة: يمكن تخزين حالة الجلسة في InProc، أو على StateServer، أو في SQL Server، أو في مخزن مخصص.
  • ⏱️ نفذ الوقت: يتحكم مهلة sessionState في ملف web.config في المدة التي تبقى فيها الجلسة نشطة.

برنامج تعليمي لإدارة الجلسات في ASP.NET مع مثال

إدارة جلسات ASP.NET

بروتوكول HTTP الذي تعمل عليه جميع تطبيقات الويب هو بروتوكول عديم الحالة. بواسطة عديم الجنسية، فهذا يعني فقط أنه لا يتم الاحتفاظ بالمعلومات من طلب إلى آخر.

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

في ASP.Net، يتم ذلك بعدة طرق. أولها عبر مفهوم يُسمى ViewState، حيث يقوم ASP.Net تلقائيًا بتخزين محتويات جميع عناصر التحكم، ويضمن أيضًا نقلها إلى الصفحة التالية. ويتم ذلك عبر خاصية تُسمى ViewState.

ليس من المثالي أن يقوم المطور بتغيير أي شيء في حالة العرض. وذلك لأنه يجب التعامل معه بواسطة ASP.Net فقط.

كائن جلسة ASP.NET

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

Session["Key"] = value

يُخزّن هذا القيمة في كائن جلسة، ويُستخدم جزء "المفتاح" لتسمية القيمة. يسمح هذا باسترجاع القيمة لاحقًا. لاسترجاع قيمة، يمكنك ببساطة تنفيذ الأمر التالي.

Session["Key"]

مثال على كائن جلسة ASP.NET

في مثالنا، سنستخدم كائن الجلسة لتخزين الاسم المُدخل في حقل نص الاسم في الصفحة. ثم سنسترجع هذه القيمة ونعرضها على الصفحة. لنضف الكود التالي إلى ملف Demo.aspx.cs.

استخدم كائن الجلسة

protected void btnSubmit_Click(object sender, EventArgs e)
{
	Session["Name"] = txtName.Text;

	Response.Write(Session["Name"]);

	lblName.Visible = false;
	txtName.Visible = false;
	lstLocation.Visible = false;
	chkC.Visible = false;
	chkASP.Visible = false;
	rdMale.Visible = false;
	rdFemale.Visible = false;
	btnSubmit.Visible = false;
}

Code تفسير:-

  1. يأخذ السطر الأول من التعليمات البرمجية قيمة عنصر تحكم مربع النص "الاسم" ويخزنها في كائن الجلسة. بتحديد رمز Session["Name"]، فإننا نُعطي الخاصية اسمًا يُسمى "الاسم". يُسهّل تحديد اسم للخاصية استرجاعها لاحقًا.
  2. يسترد السطر التالي من التعليمات البرمجية القيمة المخزنة من كائن الجلسة. ثم يقوم بكتابة هذه القيمة عبر أسلوب "Response.Write" مرة أخرى إلى العميل.
  3. وأخيرًا، نجعل جميع عناصر التحكم في النموذج غير مرئية. إذا لم نفعل ذلك، فستظهر جميع عناصر التحكم بالإضافة إلى قيم الاستجابة معًا.

بمجرد إجراء التغييرات المذكورة أعلاه، سترى المخرجات التالية.

الإخراج:

استخدم كائن الجلسة

من الناتج، يمكنك أن ترى أن قيمة جلسة الاسم تم استردادها وعرضها في المتصفح.

أوضاع حالة جلسة ASP.NET

يمكن لـ ASP.NET تخزين بيانات الجلسة في عدة مواقع، تُسمى أوضاع حالة الجلسة. يؤثر الوضع الذي تختاره على الأداء وقابلية التوسع، وعلى ما إذا كانت البيانات ستبقى محفوظة بعد إعادة تشغيل التطبيق. يقارن الجدول أدناه بين هذه الأوضاع:

المعالم مكان تخزين الحالة أفضل ل
InProc في ذاكرة خادم الويب (افتراضيًا) تطبيقات الخادم الواحد؛ الأسرع، ولكنها تفقد بياناتها عند إعادة التشغيل
خادم الدولة عملية خدمة حالة ASP.NET منفصلة مزارع الويب؛ تستمر بعد إعادة تشغيل التطبيق
خادم قاعدة البيانات قاعدة بيانات SQL Server مزارع الويب التي تحتاج إلى حالة متينة وقابلة للتوسع
فن التأطير المتخصص موفر مخصص تقوم بتنفيذه متاجر متخصصة مثل Redis
خصم حالة الجلسة معطلة التطبيقات التي لا تحتاج إلى جلسات

InProc هو الوضع الافتراضي والأسرع، ولكن بالنسبة لعمليات النشر المتوازنة الأحمال، فإن StateServer أو SQLServer يحافظ على الجلسات متاحة عبر خوادم متعددة.

كيفية ضبط مهلة الجلسة في ASP.NET

لا تدوم الجلسة إلى الأبد؛ بل تنتهي صلاحيتها بعد فترة من عدم النشاط. يمكنك ضبط مهلة الجلسة في ملف web.config باستخدام عنصر sessionState، حيث تكون قيمة المهلة بالدقائق.

<configuration>
  <system.web>
    <sessionState mode="InProc" timeout="20" />
  </system.web>
</configuration>

يمكنك أيضًا ضبطه في الكود باستخدام Session.Timeout = 30;المهلة الافتراضية هي 20 دقيقة. اختيار مهلة أقصر يحرر ذاكرة الخادم بشكل أسرع ويحسن الأمان، بينما المهلة الأطول تبقي المستخدمين مسجلين الدخول لفترة أطول.

مزايا وعيوب حالة الجلسة

تُعد حالة الجلسة مريحة، ولكن لها جوانب سلبية يجب مراعاتها قبل الاعتماد عليها بشكل كبير.

المزايا:

  • سهل الاستخدام لتخزين بيانات كل مستخدم على حدة، مثل بيانات المتجر.ping بيانات سلة التسوق أو بيانات تسجيل الدخول.
  • يمكنه تخزين كائنات معقدة، وليس مجرد سلاسل نصية.
  • يتم الاحتفاظ بالبيانات على الخادم، لذا فهي أكثر أمانًا من التخزين على جانب العميل.

العيوب:

  • يستهلك وضع InProc ذاكرة الخادم ولا يمكن توسيعه عبر مزرعة خوادم الويب.
  • تُفقد بيانات الجلسة عند انتهاء مهلة الجلسة أو إعادة تشغيل التطبيق (في وضع InProc).
  • قد يؤدي تخزين كميات كبيرة من البيانات لكل مستخدم إلى الإضرار بالأداء تحت ضغط عالٍ.

الأسئلة الشائعة

نعم. يمكن للمساعدين الذين يعملون بالذكاء الاصطناعي إنشاء التعليمات البرمجية لتخزين وقراءة قيم الجلسة، واقتراح وضع الحالة الصحيح، وكتابة إعدادات web.config. Revراجع الكود المُنشأ للتأكد من أنه يلبي احتياجاتك من حيث قابلية التوسع والأمان.

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

تخزن حالة الجلسة بيانات جلسة مستخدم واحد، بينما تخزن حالة التطبيق بيانات مشتركة بين جميع مستخدمي التطبيق. استخدم حالة الجلسة للقيم الخاصة بكل مستخدم، وحالة التطبيق للبيانات العامة مثل العدادات أو الإعدادات.

لا. يحصل كل مستخدم على جلسة منفصلة، ​​يتم تحديدها بواسطة معرّف جلسة فريد مُخزّن في ملف تعريف ارتباط. لا يمكن لمستخدم واحد قراءة قيم جلسة مستخدم آخر، ولهذا السبب تُستخدم الجلسة لبيانات كل مستخدم على حدة.

تلخيص هذه التدوينة بـ: