सत्र.एंडबोन () और सेशन। क्लियर () के बीच क्या अंतर है


109

एक सत्र को नष्ट करने और उसके मूल्यों को हटाने के बीच क्या अंतर है? क्या आप इसे प्रदर्शित करने वाला उदाहरण प्रदान कर सकते हैं?

मैंने इस प्रश्न की खोज की, लेकिन कुल उत्तर को समझ नहीं पाया। कुछ जवाब हैं:

  • Session.Abandon() सत्र को नष्ट कर देता है
  • Session.Clear() बस सभी मूल्यों को हटा देता है

एक मित्र ने मुझे यह बताया:

सत्र को साफ़ करना सत्र को परेशान नहीं करेगा, यह अभी भी उपयोगकर्ता के लिए एक ही आईडी के साथ मौजूद है, लेकिन केवल साफ किए गए मानों के साथ।

एबंडन सत्र को पूरी तरह से नष्ट कर देगा, जिसका अर्थ है कि आपको उस उपयोगकर्ता के लिए सत्र में किसी भी अधिक मान को संग्रहीत करने से पहले एक नया सत्र शुरू करने की आवश्यकता है।

नीचे दिया गया कोड काम करता है और कोई अपवाद नहीं डालता है।

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

जब आप एक सत्र छोड़ देते हैं, तो आपको (या उपयोगकर्ता को) एक नया सत्र मिलेगा

जब मैं सत्र का परीक्षण करता हूं, तो जब मैं सत्र को छोड़ देता हूं तो यह कोई बदलाव नहीं करता है।

मुझे सिर्फ एक अंतर लगता है: घटना को session.Abandon()उठाता हैSession_End


5
सत्र। तुरंत आइटम निकालें, लेकिन सत्र। और सत्र के अनुरोध के अंत में छोड़ दिए जाने वाले सत्र को चिह्नित करता है।
RepDbg

जवाबों:


147

स्पष्ट - सत्र-राज्य संग्रह से सभी कुंजी और मान निकालता है।

परित्याग - एक सत्र में संग्रहीत सभी वस्तुओं को हटा देता है। यदि आप स्पष्ट रूप से एबंड विधि को नहीं कहते हैं, तो सर्वर इन ऑब्जेक्ट्स को हटा देता है और सत्र समय समाप्त होने पर सत्र को नष्ट कर देता है।
यह Session_End जैसी घटनाओं को भी बढ़ाता है ।

Session.Clear को शेल्फ से सभी पुस्तकों को हटाने की तुलना की जा सकती है , जबकि Session.Abandon को पूरे शेल्फ को फेंकने की तरह है

तुम कहो:

जब मैं सत्र का परीक्षण करता हूं, तो जब मैं सत्र को छोड़ देता हूं तो यह कोई बदलाव नहीं करता है।

यह सही है जब आप इसे केवल एक अनुरोध के भीतर कर रहे हैं ।
अगले अनुरोध पर सत्र अलग होगा। लेकिन सत्र आईडी का पुन: उपयोग किया जा सकता है ताकि आईडी समान रहेगी।

यदि आप सत्र का उपयोग करेंगे। तो ठीक है आपके पास कई अनुरोधों में एक ही सत्र होगा।

आम तौर पर, ज्यादातर मामलों में आपको Session.Clear का उपयोग करने की आवश्यकता होती है।
आप सत्र का उपयोग कर सकते हैं। और यदि आप सुनिश्चित हैं कि उपयोगकर्ता आपकी साइट को छोड़ने जा रहा है।

तो वापस मतभेदों के लिए:

  1. परित्याग Session_End अनुरोध को बढ़ाता है।
  2. स्पष्ट रूप से आइटम निकालता है, Abandon नहीं करता है।
  3. परित्याग SessionState ऑब्जेक्ट और इसकी वस्तुओं को छोड़ देता है ताकि यह संसाधनों को मुक्त करने के लिए एकत्र किए गए कचरे को बा कर सके। स्पष्ट SessionState और इससे जुड़े संसाधन रखता है।

और अगर मैं session.clear () कहता हूं, तो आप फिर से आरोपों को बताते हैं। नहीं? (बाकी सभी सेशन_एंड इवेंट बढ़ाते हुए)
बैकडोर

Session.Clear केवल सत्र से आइटम निकाल देगा । और कुछ नहीं। आप इसे आवश्यकतानुसार कई बार कॉल कर सकते हैं।
दमित्री नागिरन्याक

@AnthonyWJones, आप सही हैं "नष्ट" कहना गलत है। बेहतर है सत्र से प्राप्त वस्तुएं। लेकिन Session.Clear भी ऑब्जेक्ट्स को नष्ट नहीं करता है, यह थैम को सत्र से हटा देता है ताकि वे कचरा एकत्र कर सकें। इसके अलावा, कॉम्पलेक्स वस्तुओं को संग्रहीत करने की अनुशंसा नहीं की जाती है, अन्यथा मैं इसे ठीक मानता हूं।
दिमित्री नागिरिनाक

@ डमित्री: "कॉम्प्लेक्स ऑब्जेक्ट्स को स्टोर करने की अनुशंसा क्यों नहीं की जाती है"?
कामारेई

5
@ मैं सहमत हूं, हालांकि मैं यह कहकर इसे आगे बढ़ाऊंगा कि Session.Clearसभी पुस्तकों को शेल्फ से तुरंत हटाने की तुलना की जा सकती है , जबकि Session.Abandonयह कहना अधिक पसंद है कि "पूरे शेल्फ को फेंक दें और मुझे बताएं कि जब आप काम कर रहे हों "।
WynandB

20

जब आप Abandon()एक सत्र, आप (या बल्कि उपयोगकर्ता) एक नया सत्र मिलेगा (अगले अनुरोध पर)। जब आप Clear()एक सत्र, सभी संग्रहीत मान निकाल दिए जाते हैं, लेकिन सत्रांक बरकरार रहता है।


3
धन्यवाद। लेकिन मैकडॉनल्ड्स बुक करने के लिए यह एक ही सत्र आईडी का उपयोग कर सकते हैं। मेरा मतलब है कि अगर regenerateExpiredSessionId विन्यास में विशेषता / system.web / sessionState तत्व web.config फ़ाइल में गलत है। ASP.Net पुराने सत्र आईडी का उपयोग करता है
पिछले दरवाजे

2
@ हैंसिंग केसिंग को छोड़ देने पर उसे एक नया सत्र आईडी नहीं मिलेगा। नई सत्र आईडी प्राप्त करने के लिए उसे ASPNET_SessionID कुकी को स्पष्ट रूप से सेट करना होगा।
Zo हैव

9

यह वह जगह है प्रकार के ऊपर विभिन्न प्रतिक्रियाओं द्वारा कवर की है, लेकिन पहली बार मैं इस लेख को पढ़ने के मैं एक महत्वपूर्ण तथ्य है, जो मेरे कोड में एक मामूली बग के लिए नेतृत्व किया याद किया ...

Session.Clear() सभी कुंजियों के मूल्यों को स्पष्ट करेगा, लेकिन सत्र समाप्ति की घटना को आग नहीं देगा।

Session.Abandon()वर्तमान अनुरोध पर मानों को साफ़ नहीं करेगा। यदि किसी अन्य पृष्ठ का अनुरोध किया जाता है, तो मान उसी के लिए चले जाएंगे। हालाँकि, इस घटना को छोड़ देंगे।

तो, मेरे मामले में (और शायद आप में?), मुझे इसके Clear()बाद की जरूरत थी Abandon()


1
आपको सत्र की आवश्यकता क्यों होगी। आप एक संग्रह के मूल्यों को साफ़ कर रहे हैं जिसे आप नष्ट कर रहे हैं? यह पूरी तरह से बेमानी है। निश्चित रूप से सत्र वस्तु को तुरंत नष्ट नहीं किया गया है (जो कि वर्तमान अनुरोध के अंत में होता है), लेकिन उस सत्र आईडी को अब किसी भी अन्य अनुरोध के द्वारा नहीं दिया जाएगा। यदि ग्राहक एक नया अनुरोध करता है, तो उन्हें एक नया सत्र दिया जाएगा। यदि आप किसी सत्र सत्र चर का उपयोग Global.sax () में करना चाहते हैं, तो पहले कॉलिंग क्लियर भी समस्या पैदा करेगा।
RepDbg

@RepDbg वास्तव में मैं असहमत हूं। Session.Abandon ()। क्लाइंट को एक नया सत्र आईडी देता है। सत्र के बारे में सर्वर पर सभी जानकारी को साफ करता है। इसलिए कोई अन्य उपयोगकर्ता नहीं कर सकता। मैं NRC से सहमत हूँ
मीका आर्मेंट्राउट

@ मीका आर्मेंट्राउट मैं आपके तर्क का पालन नहीं कर रहा हूं। सत्र के साथ एक सत्र को क्यों साफ़ करें। साफ़ करें (), फिर सत्र को बुलाएँ। और () जो न केवल सत्र को पूरा करता है, बल्कि उसे पूरी तरह से निपटा भी देता है। इसके अलावा सत्र.एकंडन () क्लाइंट को नया सत्र आईडी नहीं देता है। एक बाद का अनुरोध, लेकिन उस अनुरोध की पूर्ति नहीं होगी जिसे सत्र कहा जाता है। Abandon ()।
२१

यदि आप सिर्फ सत्र। का उपयोग करते हैं, तो ASP.NET पाइपलाइन में अन्य शेष तर्क अभी भी वर्तमान सत्र मानों तक पहुंच सकते हैं।
मार्क सोउल

6

यह कोड काम करता है और कोई अपवाद नहीं फेंकता है:

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

ऐसा इसलिए है क्योंकि जब एब्डान विधि को बुलाया जाता है, तो वर्तमान सत्र ऑब्जेक्ट को हटाने के लिए कतारबद्ध किया जाता है लेकिन वास्तव में तब तक हटाया नहीं जाता है जब तक कि वर्तमान पृष्ठ पर सभी स्क्रिप्ट कमांड संसाधित नहीं हो जाते हैं। इसका मतलब यह है कि आप सत्र ऑब्जेक्ट में संग्रहीत चर को एबंड विधि के लिए कॉल के रूप में एक्सेस कर सकते हैं लेकिन किसी अन्य वेब पेज में नहीं।

उदाहरण के लिए, निम्न लिपि में, तीसरी पंक्ति मूल्य मैरी छापती है। इसका कारण यह है कि जब तक सर्वर ने स्क्रिप्ट को संसाधित नहीं किया है तब तक सत्र ऑब्जेक्ट नष्ट नहीं होता है।

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

यदि आप बाद के वेब पेज पर वैरिएबल MyName को एक्सेस करते हैं, तो यह खाली है। ऐसा इसलिए है क्योंकि MyName पिछली सत्र ऑब्जेक्ट के साथ नष्ट हो गया था जब पृष्ठ पिछले उदाहरण के साथ समाप्त हो गया था प्रसंस्करण।

से MSDN Session.Abandon


3

एक सत्र को मंजूरी देने से उन मूल्यों को हटा दिया जाता है जो वहां संग्रहीत थे, लेकिन आप अभी भी वहां नए जोड़ सकते हैं। सत्र को नष्ट करने के बाद आप वहां नए मूल्य नहीं जोड़ सकते।


धन्यवाद, लेकिन यह काम करता है: (आपके विचार के साथ असंगत) सत्र.एकंडन (); सत्र ["tempKey1"] = "tempValue1"; Response.Write (सत्र [ "tempKey1"] ToString ()।);
पिछले

ऐसा इसलिए होता है क्योंकि सत्र आपके पृष्ठ को वास्तव में ताज़ा करने के बाद नष्ट हो जाएगा। सत्र आईडी इसे (आमतौर पर) कुकी में संग्रहीत किया जाता है।
रायल

मैं नहीं समझता। मेरा मतलब है कि मैं सत्र के बाद फोन करता हूं। (अब भी) मैं इसमें मूल्य जोड़ सकता हूं। (भले ही पृष्ठ वापस और फिर से पोस्ट किया गया हो)।
पिछले दरवाजे

1
नष्ट होने के बाद आपके पास ऑटोरेगनेट आईडी पर सत्र सेट हो सकता है। इसलिए जब आप नष्ट सत्र के लिए एक मूल्य प्रदान करते हैं तो नया सत्र स्वचालित रूप से उत्पन्न हो जाएगा।
रायल

1
हां, इस सत्र आईडी का उपयोग करने से पुनर्जीवित हो जाएगा, लेकिन मेरा सवाल यह है: सत्र (क्लियर) और सेशन के बीच क्या अलग है। इस तरह से जब autoregenerate झूठे इन टो करने के लिए सेट किया गया है न तो किसी और चीज में अलग Sesion_End?
पिछले दरवाजे

3

स्पष्ट-इसकी निकालें कुंजी या सत्र सत्र संग्रह से मान ..

सत्र से वस्तुओं को हटाना या हटाना


1
Session.Abandon() 

पूरे सत्र को नष्ट / मार देगा।

Session.Clear()

सत्र डेटा (मौजूदा सत्र से कुंजी और मान) हटाता है, लेकिन सत्र जीवित रहेगा।

Session.Abandon () पद्धति से तुलना करें, Session.Clear () नया सत्र नहीं बनाता है, यह सत्र के सभी चर को NULL में बनाता है।

जब तक ब्राउज़र बंद नहीं होगा तब तक दोनों मामलों में सेशन आईडी एक ही रहेगी।

Session.RemoveAll()

यह सत्र-राज्य संग्रह से सभी कुंजी और मान निकालता है।

Session.Remove()

यह सत्र-राज्य संग्रह से कोई आइटम हटाता है।

Session.RemoveAt()

यह सत्र-राज्य संग्रह से एक निर्दिष्ट सूचकांक में एक आइटम को हटाता है।

Session.TimeOut()

यह गुण अनुप्रयोग के लिए सत्र ऑब्जेक्ट को निर्दिष्ट समय-आउट अवधि निर्दिष्ट करता है। (समय मिनटों में निर्दिष्ट किया जाएगा)।

यदि उपयोगकर्ता टाइम-आउट अवधि के भीतर किसी पृष्ठ को ताज़ा या अनुरोध नहीं करता है, तो सत्र समाप्त हो जाता है।


0

सेशनिड की मौजूदगी सत्र निर्धारण हमले का कारण बन सकती है जो पीसीआई अनुपालन में बिंदु में से एक है। सत्र निर्धारण को हटाने और सत्र निर्धारण हमले को दूर करने के लिए, इस समाधान को पढ़ें - ASP.NET में सत्र निर्धारण की भेद्यता से कैसे बचें?


0

मुझे लगता है कि इसका उपयोग करने के Session.Clear()बजाय उपयोग करना आसान होगाSession.Abandon()

क्योंकि मान अभी भी बाद में कॉल करने के बाद सत्र में मौजूद हैं, लेकिन पूर्व को कॉल करने के बाद हटा दिए जाते हैं।


0
this code works and dont throw any exception:

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

यहां एक बात ध्यान देने वाली है कि सत्र। तुरंत आइटम हटाएं लेकिन सत्र।और वर्तमान अनुरोध के अंत में छोड़ दिए जाने वाले सत्र को चिह्नित करता है। इसका सीधा सा मतलब है कि मान लें कि आपने सत्र के बाद ही कोड में मूल्य का उपयोग करने की कोशिश की थी। कमांड का निष्पादन होने के बाद भी यह वहीं रहेगा। इसलिए यदि आपका कोड सत्र जारी करने के बाद भी काम नहीं कर रहा है, तो भ्रमित न हों। कमांड को छोड़ें और तुरंत सत्र के साथ कुछ तर्क दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.