سؤال

ما هو الفرق بين تدمير جلسة وإزالة قيمها؟ هل يمكنك تقديم مثال إظهار ذلك؟

لقد بحثت عن هذا السؤال، لكن لا أدرك الإجابة التامة. بعض الإجابات هي:

  • Session.Abandon() يدمر الجلسة
  • Session.Clear() فقط يزيل جميع القيم

أخبرني صديق هذا:

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

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

يعمل الرمز أدناه ولا يرمي أي استثناءات.

Session.Abandon();
Session["tempKey1"] = "tempValue1";

عند التخلي عن جلسة ()، ستحصل عليك (أو بالأحرى المستخدم) على إحداث جلسة جديدة

عندما اختبار الجلسة، لا يجعل أي تغيير عندما أتخلى عن الجلسة.

أنا فقط أجد فرقا واحدا:session.Abandon() يثير Session_End حدث

هل كانت مفيدة؟

المحلول

واضح - يزيل جميع المفاتيح والقيم من مجموعة Session-State.

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

الجلسة. يمكن مقارنتها إزالة جميع الكتب من الرف, ، في حين أن الدورة. القباردا أشبه رمي بعيدا الرف كله.

قول انت:

عندما اختبار الجلسة، لا يجعل أي تغيير عندما أتخلى عن الجلسة.

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

إذا كنت ستستخدم Session.clear سيكون لديك نفس الجلسة في العديد من الطلبات.

بشكل عام، في معظم الحالات تحتاج إلى استخدام الجلسة.
يمكنك استخدام Session.Abandon إذا كنت متأكدا من أن المستخدم سوف يترك موقعك.

حتى الآن إلى الاختلافات:

  1. التخلي يثير طلب الجلسة.
  2. مسح يزيل العناصر بشكل خطي، التخلي لا.
  3. تخلى التخلي عن كائن جلسة الدورة والعناصر الخاصة به بحيث يمكن جمع القمامة التي تم جمعها لتحرير الموارد. واضح يبقي الدورة والموارد المرتبطة به.

نصائح أخرى

عندما انت Abandon() ستحصل جلسة، أنت (أو بالأحرى المستخدم) على جلسة جديدة (في الطلب التالي). عندما انت Clear() جلسة، تتم إزالة جميع القيم المخزنة، ولكن تبقى الجلسة سليمة.

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

Session.Clear() سيقوم بمسح قيم جميع المفاتيح ولكن لن تسبب حفل نهاية الجلسة في إطلاق النار.

Session.Abandon() لن توضح القيم على الطلب الحالي. إذا طلبت صفحة أخرى، فسوف تختفي القيم لذلك. ومع ذلك، فإن التخلي سوف يرمي الحدث.

لذلك، في حالتي (وربما في كلماتك؟)، كنت بحاجة Clear() تليها Abandon().

هذا الرمز يعمل ولا يرمي أي استثناء:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

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

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

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

إذا كنت تصل إلى MyName المتغير في صفحة ويب لاحقة، فهي فارغة. وذلك لأن myname تم تدميره مع كائن الجلسة السابقة عندما تتم معالجة الصفحة التي تحتوي على المثال السابق.

من عند MSDN Session.Abandon.

يزيل مسح جلسة القيم التي تم تخزينها هناك، لكنك لا تزال تتمكن من إضافة جديدة هناك. بعد تدمير الجلسة، لا يمكنك إضافة قيم جديدة هناك.

مسح - إزالة مفتاح أو قيم من مجموعة Session State ..

التخلي عن كائنات جلسة إزالة أو حذفها من الجلسة ..

Session.Abandon() 

سوف يدمر / قتل الجلسة بأكملها.

Session.Clear()

يزيل / مسح بيانات الجلسة (أي المفاتيح والقيم من الجلسة الحالية) ولكن الدورة ستكون على قيد الحياة.

قارن بين الجلسة.ABandon () طريقة، Session.clear () لا تنشئ الجلسة الجديدة، فهي تجعل جميع المتغيرات في الجلسة إلى فارغة.

ستبقى معرف الجلسة نفسها في كلتا الحالتين، طالما لم يتم إغلاق المتصفح.

Session.RemoveAll()

يزيل جميع المفاتيح والقيم من مجموعة Session-State.

Session.Remove()

إنه يحذف عنصر من مجموعة Session-State.

Session.RemoveAt()

إنه يحذف عنصر في فهرس محدد من مجموعة Session-State.

Session.TimeOut()

تحدد هذه الخاصية فترة المهلة المخصصة لكائن الجلسة للتطبيق. (سيتم تحديد الوقت في دقائق).

إذا كان المستخدم لا ينعش أو يطلب من صفحة في غضون فترة المهلة، فإن الجلسة تنتهي.

يمكن أن يتسبب وجود جلسة في جلسة التثبيت الهجوم الذي يعد أحد النقاط في امتثال PCI. لإزالة الجلسة والتغلب على هجوم تثبيت الجلسة، اقرأ هذا الحل - كيفية تجنب مشكلة عدم حصانة تثبيت الجلسة في ASP.NET؟.

أعتقد أنه سيكون مفيدا للاستخدام Session.Clear() بدلا من استخدام Session.Abandon().

نظرا لأن القيم لا تزال موجودة في الجلسة بعد الاتصال لاحقا ولكن تتم إزالتها بعد استدعاء السابق.

this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top