2008-12-02 8 views
8

हम यह तय करने का प्रयास कर रहे हैं कि प्रत्येक अनुरोध में डेटाबेस से डेटा प्राप्त करने से बचने के लिए पोस्टबैक में ऑब्जेक्ट दृढ़ता को कैसे संभाला जाए, और मैं सत्र का उपयोग करने की ओर झुका रहा हूं (यह एक इंट्रानेट एप्लिकेशन है, हजारों उपयोगकर्ता नहीं होंगे) , लेकिन यह इस तथ्य के कारण है कि मुझे संदेह है कि वास्तविक वस्तु का संदर्भ केवल वहां संग्रहीत किया जाता है ...एएसपी.नेट में सत्र में वास्तव में क्या संग्रहीत किया जाता है?

क्या कोई सच है तो क्या कोई सच है?

मैं हमेशा से अधिक सत्र वस्तु का उपयोग नहीं सिखाया गया है, लेकिन अगर यह इस तरह से काम करता है यह वास्तव में एक बड़ी समस्या नहीं होगा ...

क्या वास्तव में यहाँ सत्र में संग्रहीत किया जाता है:

Session["myKey"] = myObject; 

वास्तविक धारावाहिक वस्तु, या इसका संदर्भ?

उत्तर

7

मैं इस की कोशिश की है:

मैं एक वर्ग बनाया है और (सत्र स्थिति मोड: inproc) सत्र में इस का एक उदाहरण की दुकान है। उदाहरण aspnet_wp.exe proc में रहता है।

फिर, मैंने सत्र स्थिति को SQL सर्वर में बदल दिया (अभी भी [Serializable] विशेषता के बिना) और मुझे निम्न त्रुटि मिली।

सत्र स्थिति को क्रमबद्ध करने में असमर्थ। 'स्टेटसेवर' और 'एसक्यूएलसेवर' मोड में, एएसपी.नेट सत्र राज्य वस्तुओं को क्रमबद्ध करेगा, और नतीजतन गैर-धारावाहिक वस्तुओं या मार्शलबीरफ वस्तुओं की अनुमति नहीं है।

तो, इनप्रोक सत्र स्थिति के लिए कोई क्रमबद्धरण नहीं है।

चीयर्स ... मार्टिन

+0

कूल, मैंने कोशिश की और काम किया ... परीक्षण के लिए धन्यवाद! – juan

4

एएसपी.नेट एक GUID बनाता है जो डिफ़ॉल्ट रूप से एक कुकी में संग्रहीत होता है (लेकिन आप क्वेरीस्ट्रिंग का उपयोग निर्दिष्ट कर सकते हैं) उपयोगकर्ता की पहचान करने के लिए। उस कुकी से जुड़े ऑब्जेक्ट्स को डिफ़ॉल्ट रूप से आईआईएस प्रक्रिया के भीतर सर्वर पर संग्रहीत किया जाता है।

आप कस्टम सत्र ऑब्जेक्ट स्टोर (सत्र-स्टेट स्टोर प्रदाता) भी बना सकते हैं, उदाहरण के लिए यदि आप सत्र ऑब्जेक्ट्स को प्रक्रिया से बाहर रखना चाहते हैं।

अधिक यहाँ जानकारी:

http://msdn.microsoft.com/en-us/library/ms178587.aspx

लेकिन वास्तव में अपने प्रश्न ...

बॉक्स से बाहर

जवाब देने के लिए है, तो आप इस धारणा में सही कर रहे हैं कि सत्र की दुकान दुकानों के लिए केवल एक संदर्भ उदेश्य।

हालांकि, आप serialization को प्राप्त करने के लिए, web.config में सत्र कार्यक्षमता के संग्रहण व्यवहार को भी निर्दिष्ट कर सकते हैं। 3 मोड:

  • inproc - सत्र वेब सर्वर (aspnet_wp.exe) में रहते हैं वस्तुओं के रूप में रखा है। URL पर "Munge" sessionId को web.config में "कुकी-" विन्यास का उपयोग करें (भी कुकी/डोमेन/पथ आरएफसी समस्याओं को हल करती है!)
  • StateServer - सत्र धारावाहिक और एक अलग प्रक्रिया में स्मृति में संग्रहीत (aspnet_state.exe) । राज्य सर्वर किसी अन्य मशीन
  • SQLServer पर चला सकते हैं - सत्र धारावाहिक और SQL सर्वर में संग्रहित

से ऊपर है से: http://www.eggheadcafe.com/articles/20021016.asp

4

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

मैं यहाँ लगता है कि आप पा सकते हैं बहुत अच्छा overview of session and cache

+0

यह भी मुझे लगता है, क्या इसका परीक्षण करने का कोई तरीका है? – juan

+0

आप इस व्यवहार को जांचने के लिए एक मेमोरी प्रोफाइलर का उपयोग कर सकते हैं, लेकिन मैं यह समझना चाहता हूं कि प्रोसेसिंग ऑब्जेक्ट इन-प्रो सत्र में मेमोरी खपत बढ़ रही है, अगर आप विभिन्न उपयोगकर्ताओं के बीच डेटा साझा करने की योजना बना रहे हैं, तो कैश – MichaelT

+0

में नेट बिल्ड का उपयोग करना बेहतर है। कैश में क्या अंतर्निहित है? HttpResponse.Cache सभी उपयोगकर्ताओं द्वारा साझा किया जाता है - जैसे एप्लिकेशन ऑब्जेक्ट कैश है। –

0

यह याद रखना महत्वपूर्ण है कि इन-प्रोक सत्र डेटा काफी नाजुक है ... जिसका अर्थ यह है कि वहाँ नहीं हो सकता है जब आपको उसकी सर्वाधिक आवश्यकता जरूरी है।यदि कार्यकर्ता प्रक्रिया poof किसी भी कारण से रीसायकल करती है तो यह चली गई है।

+0

इससे कोई फर्क नहीं पड़ता ... मैं इसे फिर से ले जाऊंगा ... लक्ष्य यह है कि इसे हर बार करने से बचें – juan

0

मुझे समझ में आता है कि आपके पास अभी बहुत सारी प्रदर्शन चिंताएं नहीं हैं और सत्र शायद ठीक काम करेगा; हालांकि राज्य को बनाए रखने या पोस्टबैक में डेटा ले जाने के अन्य तरीके हैं।

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

+1

अच्छा ... यह सिर्फ इतना है कि आप क्या कहते हैं , और यह केवल उसी पृष्ठ-पोस्टबैक पर काम करता है ... इसके अलावा, ऑब्जेक्ट को प्रत्येक पोस्ट में आगे और आगे यात्रा करना पड़ता है। लेकिन वैसे भी – juan

+0

धन्यवाद, आप सही हैं, अगर आप किसी पृष्ठ के भीतर राज्य को बनाए रखना चाहते हैं या अलग-अलग पृष्ठ पर ले जाना चाहते हैं तो यह स्पष्ट नहीं था। यदि ऐसा होता है तो कार्यकर्ता प्रक्रिया पुन: उपयोग करने पर आपको अपना ऑब्जेक्ट खोने का लाभ नहीं होगा। शुभकामनाएं! – Victor

2

वहाँ सत्र चर में लेखों और ब्लॉग पोस्ट है कि जटिल वस्तुओं के भंडारण के उपयोग पश्चाताप करते हैं (तकनीकी संदर्भ भंडारण करने के लिए कहा वस्तुओं) की टन कर रहे हैं। आम तौर पर, मुझे लगता है कि सत्र चर शैतान का काम है और उन सभी से बचने के लिए जो मैं कर सकता हूं।

यह कहा गया है कि, एक इंट्रानेट-तैनात ऐप के लिए, जहां डेवलपर जुआन मैनुअल का वर्णन करते हुए सत्र सत्र पर अधिक प्रभाव डालता है, मैंने कई बार और बड़ी सफलता के साथ ऐसा किया है। हां, सत्र रीसील कर सकता है, लेकिन यह एक असामान्य, एज केस है - जो तर्कसंगत सत्र टाइमआउट वाले ब्राउज़र ऐप्स को प्रभावित करने के लिए नियमित रूप से पर्याप्त नहीं होता है।

मैं कहूंगा कि जिस तरह से आप सुझाव देते हैं, जुआन मैनुअल, कम से कम पहले। लेकिन जहां आप बचत कर रहे हैं और सत्र से ऑब्जेक्ट प्राप्त कर रहे हैं (शायद एक रैपर वर्ग के साथ) जहां गिलहरी हो, ताकि आवेदन की मांग हो, बाद में बदलना आसान हो।

+0

हां, मैं एक रैपर वर्ग का उपयोग करने की योजना बना रहा था। आपकी प्रतिक्रिया के लिए धन्यवाद – juan

संबंधित मुद्दे