فهم حالة جلسة asp.net
الكاتب:Eve Cole
وقت التحديث:2009-07-01 16:44:49
1. وظائف حالة الجلسة
HTTP هو بروتوكول عديم الحالة، لذا فهو لا يشير تلقائيًا إلى ما إذا كانت سلسلة الطلبات تأتي جميعها من نفس العميل، أو حتى ما إذا كان مثيل متصفح واحد لا يزال يعرض صفحة أو موقعًا نشطًا. وباستخدام وظيفة حالة الجلسة المضمنة في ASP.net، يمكننا استخدامها
1. تحديد وتصنيف الطلبات تلقائيًا من عميل متصفح واحد إلى جلسة تطبيق منطقية على الخادم.
2. قم بتخزين البيانات الخاصة بنطاق الجلسة على الخادم لاستخدامها عبر طلبات المتصفح المتعددة.
3. رفع أحداث إدارة عمر الجلسة المناسبة (Session_OnStart، وSession_OnEnd، وما إلى ذلك) التي يمكن التعامل معها في كود التطبيق
2. تحديد حالة الجلسة
عند إنشاء جلسة، يقوم الخادم بإنشاء معرف منفصل لكل جلسة. يتم تمثيل المعرف بسلسلة معرف جلسة 120 بت تحتوي فقط على أحرف ASCII المسموح بها في عنوان URL. يتم إنشاء قيمة SessionID باستخدام خوارزمية تضمن التفرد والعشوائية. الغرض من ضمان التفرد هو التأكد من عدم تعارض الجلسات، والغرض من ضمان العشوائية هو التأكد من عدم تمكن المستخدمين الضارين من استخدام معرفات الجلسة الجديدة لحساب عدد الجلسات الموجودة. معرف الجلسة.
3. كيفية تخزين حالة الجلسة
هناك ثلاث طرق لتخزين حالة الجلسة:
1. وضع حالة الجلسة قيد التشغيل (Inproc): عندما نقوم بإنشاء برنامج ويب جديد، يتم اعتماد وضع حالة الجلسة قيد التشغيل افتراضيًا، وهذا أيضًا هو الوضع الشائع الاستخدام من قبل الجميع. في هذا الوضع، يتم تخزين حالة الجلسة محليًا في العملية المنفذة لـ ASP.NET، لذلك من المحتمل أن يكون وضع حالة الجلسة قيد التشغيل هو خيار الوصول الأسرع. ولكن كلما زادت البيانات المخزنة في الجلسة، زاد استهلاك خادم الويب للذاكرة، مما قد يزيد من خطر تدهور الأداء.
2. وضع خادم حالة .NET (StateServer): يتم تخزين حالة الجلسة في العملية عن بعد (على سبيل المثال، في خدمة Windows NT المسماة aspnet_state.exe)
3. وضع SQL (SQLServer): يتم تخزين حالة الجلسة في جدول قاعدة بيانات مخصص يديره SQL Server.
يمكن تسمية كل من وضع خادم حالة .NET ووضع SQL بوضع الجلسة خارج العملية. عند تخزين البيانات، يجب إجراء تسلسل للبيانات وتخزينها في مستودع خارجي. عند القراءة والبيانات، يجب إلغاء تسلسل البيانات ونسخها إلى قاموس الجلسة المحلية، وبالتالي أدى الطلب إلى تدهور الأداء بنسبة 15% (خارج العملية) إلى 25% (SQL Server). لاحظ أن هذا مجرد تقدير تقريبي. ولكن في سيناريو التخزين خارج العملية، تظل حالة الجلسة لفترة أطول، مما يجعل التطبيق أكثر قوة لأنه يحمي من فشل خدمات معلومات الإنترنت Microsoft® (IIS) وASP.NET. من خلال فصل حالة الجلسة عن التطبيقات، يمكنك أيضًا توسيع التطبيقات الموجودة بسهولة أكبر إلى معماريات Web Farm وWeb Garden. بالإضافة إلى ذلك، يتم تخزين حالة الجلسة في عملية خارجية، مما يؤدي بشكل أساسي إلى التخلص من مخاطر فقدان البيانات بشكل دوري بسبب حلقات العملية.
4. تكوين حالة الجلسة
يتم تحقيق تكوين حالة الجلسة عن طريق تعيين قسم في ملف Web.config. يقدم ما يلي طرق التكوين المحددة لحالات الجلسة الثلاث.
1. وضع قيد التشغيل
وضع قيد التشغيل هو وضع حالة الجلسة الافتراضي. لاستخدام الوضع قيد المعالجة، قم بتعيين سمة الوضع لعنصر إلى Inproc.
يظهر أدناه مثال لإعداد التكوين لوضع قيد التشغيل. http://www.downcodes.com
<التكوين>
<وضع حالة الجلسة = "Inproc"
ملفات تعريف الارتباط = "خطأ"
المهلة = "20"/>
</حالة الجلسة>
</system.web>
</التكوين>
2. وضع خادم الدولة
لاستخدام خادم حالة، يجب عليك أولاً التأكد من تشغيل خدمة حالة ASP.NET على الخادم البعيد المستخدم لتخزين الجلسة. تم تثبيت هذه الخدمة مع ASP.NET وVisual Studio .NET على:
SystemrootMicrosoft.NETFrameworkversionNumberaspnet_state.exe
ثم، في ملف Web.config الخاص بالتطبيق، قم بتعيين سمة الوضع لعنصر إلى StateServer. وأخيرًا، قم بتعيين خاصية سلسلة الاتصال على tcpip=serverName:portNumber.
ما يلي هو مثال لإعدادات التكوين لوضع خادم الحالة.
<التكوين>
<وضع الجلسة = "StateServer"
StateConnectionString="tcpip=dataserver:42424"
ملفات تعريف الارتباط = "خطأ"
المهلة = "20"/>
</حالة الجلسة>
</system.web>
3. وضع خادم SQL
لاستخدام SQL Server، قم أولاً بتشغيل InstallSqlState.sql أو InstallPersistSqlState.sql على كمبيوتر SQL Server حيث سيتم تخزين حالة الجلسة. يقوم كلا البرنامجين بإنشاء قاعدة بيانات باسم ASPState، والتي تحتوي على العديد من الإجراءات المخزنة.
الفرق بين البرنامجين النصيين هو المكان الذي يتم فيه وضع الجداول ASPStateTempApplications وASPStateTempSessions. يضيف البرنامج النصي InstallSqlState.sql هذه الجداول إلى قاعدة بيانات TempDB، مما سيؤدي إلى فقدان البيانات عند إعادة تشغيل الكمبيوتر. بدلاً من ذلك، يضيف البرنامج النصي InstallPersistSqlState.sql هذه الجداول إلى قاعدة بيانات ASPState، مما يسمح بالاحتفاظ ببيانات الجلسة عبر عمليات إعادة تشغيل الكمبيوتر.
بشكل افتراضي، يتم تثبيت كلا ملفي البرنامج النصي في الموقع التالي:
SystemrootMicrosoft.NETFrameworkversionNumber
ثم، في ملف Web.config الخاص بالتطبيق، قم بتعيين سمة الوضع لعنصر إلى SQLServer. وأخيراً، قم بتعيين الخاصية sqlConnectionString إلى Integrated Security=SSPI;data source=serverName;.
يظهر أدناه مثال لإعداد التكوين لوضع SQL Server.
<التكوين>
<وضع حالة الجلسة = "SQLServer"
sqlConnectionString="Integrated Security=SSPI;مصدر البيانات=dataserver;"
ملفات تعريف الارتباط = "خطأ"
المهلة = "20"/>
</حالة الجلسة>
</system.web>
</التكوين>
في وضع SQL Server، يمكن أيضًا تكوين حالة الجلسة للعمل في مجموعة تجاوز الفشل. مجموعة تجاوز الفشل عبارة عن خادمي ويب متطابقين أو أكثر يخزنان بيانات الجلسة في قاعدة بيانات SQL Server على جهاز كمبيوتر منفصل. في حالة فشل أحد خوادم الويب، يتولى خادم آخر في المجموعة عمله ويخدم الطلبات دون فقدان بيانات الجلسة.
لتكوين نظام مجموعة تجاوز الفشل، قم بتعيين عنصر في ملف Web.config الخاص بملقم الويب إلى نفس القيمة.
ثم قم بتعيين سلسلة اتصال SQL الخاصة بخادم الويب للإشارة إلى قاعدة بيانات SQL Server على جهاز الكمبيوتر الخاص بك حيث يتم تخزين بيانات الجلسة.
5. الوصول إلى حالة الجلسة
يمكنك الوصول إلى حالة الجلسة مباشرة من خلال مجموعة الجلسة. للتوافق مع الإصدارات السابقة من ASP، يمكن أيضًا تحقيق الوصول إلى حالة جلسة العمل من خلال خاصية Session.Contents الموجودة على كائن التطبيق.
يوضح المثال التالي كتابة قيمتين لمجموعة الجلسة في صفحة الويب الأولى، ثم قراءة مجموعة الجلسة في صفحة الويب الثانية. ملاحظة: تم حذف رموز الصفحة هنا.
صفحة الويب الأولى تكتب القيمة في مجموعة الجلسة
اسم خافت كسلسلة = "أ"
معرف خافت كعدد صحيح = "1"
جلسة ("الاسم") = الاسم
جلسة ("معرف") = معرف
تحصل صفحة الويب الثانية على القيمة من مجموعة الجلسة
اسم خافت كسلسلة = جلسة ("اسم")
معرف خافت كعدد صحيح = جلسة ("معرف")
'احصل على عدد العناصر الموجودة في مجموعة حالة الجلسة
خافت أنا كعدد صحيح = session.count
لاحظ أنه في وضع التشغيل، لا يحدث أي تسلسل أو إلغاء تسلسل حقيقي، لذلك يتم تخزين الكائنات في حالة الجلسة كمثيلات نشطة للفئات الخاصة بها.
في وضع الجلسة خارج العملية، نظرًا لاستخدام التسلسل وإلغاء التسلسل، يجب عليك تحويل نوع البيانات وفقًا للموقف.
إذا كنت تقوم بإجراء تسلسل لقيمة تاريخ، فيجب أن يكون التاريخ من النوع Int64.
6. أحداث إدارة دورة الحياة
يوجد حدثان لإدارة مدة الجلسة، الحدث Session_OnStart والحدث Session_OnEnd، ويمكنك تعيينهما في الملف Global.asax.VB.
1. حدث Session_OnStart
عندما يتصل عميل متصفح واحد بالخادم، يتم تشغيل حدث Session_OnStart، الذي يمثل بداية الجلسة، ولن يتم تشغيل هذا الحدث أثناء التصفح اللاحق ما لم تنته مهلة الجلسة أو يتم التخلي عنها. يعد حدث Session_OnStart هو أفضل وقت لتعيين متغيرات الجلسة لأنه يتم تعيينها قبل الوصول إلى أي صفحة.
مثال: المثال التالي هو رمز حدث Session_OnStart شائع الاستخدام لحساب عدد الأشخاص المتصلين بالإنترنت:
Sub Session_Start (مرسل ByVal ككائن، ByVal e كـ EventArgs)
'عند وقوع حدث ما، أضف 1 إلى عدد المستخدمين المتصلين بالإنترنت
التطبيق ("عدد المستخدمين") = التطبيق ("عدد المستخدمين") + 1
نهاية الفرعية
2. حدث Session_OnEnd
يقع حدث Session_OnEnd عندما يتم التخلي عن الجلسة أو انتهاء مهلتها، ويمثل نهاية الحدث. ولكن يرجى ملاحظة أن هذا الحدث مدعوم فقط في وضع InProc. يمكنك تحديد فترة المهلة من خلال سمة المهلة الخاصة بقسم في ملف Web.config إذا كان المستخدم ضمن فترة المهلة (بالدقائق، فالقيمة الافتراضية هي 20 دقيقة).
على مدار الساعة) بدون تحديث صفحة الويب أو طلبها، سيتم إنهاء الجلسة. يمكنك استخدام الحدث Session_OnEnd للقيام ببعض أعمال التنظيف.
مثال: المثال التالي هو رمز حدث Session_OnEnd شائع الاستخدام لحساب عدد الأشخاص المتصلين بالإنترنت:
Sub Session_End (مرسل ByVal ككائن، ByVal e كـ EventArgs)
التطبيق ("عدد المستخدمين") = التطبيق ("عدد المستخدمين") - 1
نهاية الفرعية