2011-08-05 14 views
6

मैं इस पर कुछ समय के लिए उत्तर खोज रहा हूं क्योंकि यह मुझे परेशान करता रहा है। हम सत्र राज्य (इनप्रोक) में उपयोगकर्ता की वर्तमान गतिविधियों के बारे में उपयोगकर्ता लॉगिन जानकारी और अन्य डेटा संग्रहीत करते हैं। प्रत्येक बार अक्सर मुझे एक सत्र संदर्भ चर का उपयोग करने का प्रयास करने के लिए एक नल संदर्भ अपवाद मिलता है। यादृच्छिक सत्र चर के साथ, यह यादृच्छिक पृष्ठों पर होता है। मैं web.config httpRuntime और compliation टैग AppPool पुन: प्रारंभ होता रोकने के लिए संशोधित किया है:ASP.NET यादृच्छिक रूप से सत्र मान

<httpRuntime requestValidationMode="2.0" waitChangeNotification="86400" maxWaitChangeNotification="86400" /> 
<compilation debug="False" strict="false" explicit="true" targetFramework="4.0" numRecompilesBeforeAppRestart="1000" /> 

मुझे यकीन है कि यह does not जब लोग सर्वर का उपयोग करने में व्यस्त हैं पुनः आरंभ करने के लिए 3 बजे एप्लिकेशन पूल पुनः आरंभ करने के आईआईएस निर्धारित किया है। और मैं यह सुनिश्चित करने के लिए ईवेंट लॉग में ऐप पूल पुनरारंभ कर रहा हूं कि मुझे पता चल रहा है कि यह कब हो रहा है।

Dim runtime As HttpRuntime = GetType(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.GetField, Nothing, Nothing, Nothing) 
Dim shutDownMessage As String = runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing) 

Dim shutDownStack As String = runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing) 
Dim evtSource As String = "ASP.NET" 
Dim log As New EventLog 
log.Source = evtSource 
log.WriteEntry(String.Format("_shutDownMessage={0}{2}_shutDownStack={1}", shutDownMessage, shutDownStack, vbCrLf & vbCrLf), EventLogEntryType.Warning) 

ऐप पूल पुनरारंभ होने पर मुझे ईवेंट लॉग प्रविष्टियां मिलती हैं। ये त्रुटियां होने पर ऐप पूल पुनरारंभ नहीं हो रहा है।

जब विशेष सत्र चर खो जाते हैं, तो उसी उपयोगकर्ता के लिए अन्य सत्र सत्रों में से अधिकांश अभी भी मौजूद हैं। साथ ही, आमतौर पर साइट पर लॉग इन किए गए 10-20 उपयोगकर्ता भी होते हैं जो ऐसा होने पर अप्रभावित होते हैं।
त्रुटि जो उपयोगकर्ता को त्रुटि मिलती है, वह फिर से उसी पृष्ठ पर जायेगी, और यह ठीक काम करेगी।

मुझे यह समस्या Windows Server 2003 (32 बिट) पर आईआईएस 6 चलाने के साथ .NET 3.5 32 बिट और 4 जीबी मेमोरी के साथ चल रही थी .. एक साल पहले हमारे सर्वर के उन्नयन के हिस्से के रूप में हमें एक नया वेबसर्वर मिला - विंडोज सर्वर 2008 (64 बिट) 16 जीबी मेमोरी के साथ आईआईएस 7 चला रहा है। मैंने वेबसाइट को .NET 4.0 64 बिट में अपग्रेड किया। अभी भी नई मशीन पर एक ही समस्या है (आमतौर पर प्रति दिन 1-3 बार - दिन के दौरान यादृच्छिक समय पर)।

मैं इसे अपनी यादृच्छिक प्रकृति के कारण अपने डिबगिंग में नहीं कर सकता, लेकिन मुझे विश्वास है कि यह हमारे देव पर्यावरण पर भी यादृच्छिक रूप से होता है। देव सर्वर के पास लगभग एक ही चश्मा उत्पादन के रूप में है।
दोनों वातावरण अलग-अलग हैं और एक वेब सर्वर के रूप में चल रहे हैं, न कि वेब फार्म का हिस्सा।

मैं सोच रहा हूँ कि मैं inproc मोड से बाहर निकलने के लिए एक राज्य सर्वर को लागू करने की कोशिश कर सकते हैं, लेकिन वह सिर्फ अंधेरे में एक और वार ..
राज्य सर्वर की कोशिश कर के अलावा है, ऐसा कुछ हो रहा है कर सकते हैं यह कब होता है यह पहचानने या इसे रोकने के लिए करते हैं?

+0

स्टैक ओवरव्लो पर खोजने का प्रयास करें, कई सलाहयों के साथ बहुत सारे प्रश्न हैं – sll

+0

क्या आप लोड बैलेंसर के पीछे दोनों वेब सर्वर चलाते हैं? (और क्या आप वाकई अपने कोड के माध्यम से अच्छी जांच कर चुके हैं, जहां ये सुनिश्चित किए गए हैं कि वे ओवरराइट नहीं हैं)? – Paddy

+0

मैं कोड के माध्यम से बार-बार देख रहा हूं कि मैं अनजाने में उन्हें ओवरराइट कर सकता हूं, लेकिन मुझे कोई भी जगह नहीं मिल सकती है। साथ ही, यह अलग-अलग सत्र वर्रों के लिए कई अलग-अलग पृष्ठों पर होता है - और विभिन्न उपयोगकर्ताओं/ब्राउज़रों/प्लेटफ़ॉर्म के साथ। उदाहरण के बीच मुझे कोई सहसंबंध नहीं मिल सकता है जब यह होता है – Stephen

उत्तर

7

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

मैंने आवेदन कैश और सत्र राज्य के लिए लगभग 7 या 8 महीने पहले NCache आउट-ऑफ-प्रोसेस स्टेट सर्वर लागू किया था। दुर्भाग्य से, सत्र से बाहर की प्रक्रिया को मेरे साइट पर रिपोर्ट चयन के दौरान यादृच्छिक सत्र चर खोने की मेरी समस्या का कोई असर नहीं पड़ा है। और, जैसा कि मैं इस समस्या को दोहराने में असमर्थ था, मैंने हाल ही में इसे ठीक करने की कोशिश में और अधिक प्रयास नहीं किया था जब एक और समस्या ने मेरे सिर में प्रकाश डाला।

बिंदु पर पहुंचने के लिए - मैं कहीं भी सत्र चर को ओवरराइट नहीं कर रहा था जिसे मैंने महसूस नहीं किया था, लेकिन समस्या यह थी कि उपयोगकर्ता रिपोर्ट चयन विकल्पों की तरफ से तुलना करने के लिए दूसरा (या तीसरा) टैब खोल रहा था। हमारे पास कई कस्टम रिपोर्ट हैं जहां उपयोगकर्ता कस्टम रिपोर्ट जेनरेट करने के लिए कई विकल्प चुन सकते हैं (इसके बारे में सोचें कि एक विज़ार्ड नियंत्रण है जहां कस्टम रिपोर्ट बनाने के लिए कई कदम हैं)। यदि कोई उपयोगकर्ता 5 का चरण 3 पर है, और उसके बाद एक नया टैब खुलता है और रिपोर्ट चयन प्रक्रिया के माध्यम से फिर से शुरू होता है, तो नए चयन पुराने चयनों को ओवरराइट कर रहे हैं b/c 2 टैब एक ही सत्र साझा करते हैं। मैंने सत्यापित किया कि यह कई टैब खोलकर और चयन प्रक्रिया के माध्यम से कदम उठाकर मामला था।

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

अगर कोई इस पोस्ट को पाता है और सोचता है कि वे सत्र डेटा को यादृच्छिक रूप से खो रहे हैं और इसे दोहराना नहीं चाहते हैं, तो अपनी साइट को डीबग करने और एकाधिक टैब खोलने का प्रयास करें।एक ही समय में दोनों टैबों के माध्यम से कदम मेरे लिए समस्या को प्रकाशित किया।

HTH

+1

ऐसी ही समस्या है, समस्या को दोहराना मुश्किल है ... (अन्य उपयोगकर्ता नहीं करते हैं, और मुझे नहीं लगता कि ब्राउज़र इसका कारण बन सकता है, क्योंकि ब्राउजर जॉब केवल सेसिसिड भेजना है)। लेकिन उपरोक्त एक तार्किक कारण है, हम खोज करेंगे कि क्या उपयोगकर्ता एकाधिक पेज खोलता है। – visual

+0

बेहतर डिज़ाइन का उपयोग करके इस बहु-पृष्ठ समस्या से बचें। अपने क्लाइंट-स्टेटस को अपने सत्र चर से हटाएं और उन्हें बजाय क्वेरीस्ट्रिंग पर रखें ... यानी। ? reportname = summary & page = 1 और pagelength = 20 और reportparameter1 = आदि मेरी राय यह है कि सत्र केवल उपयोगकर्ता या हश को संग्रहीत करने के लिए उपयोगी होता है, जब वे लॉगिन करते हैं या कुकी के साथ वापस आते हैं। – Awerealis

+0

@Awerealis, हाँ, क्वेरीस्ट्रिंग में पैराम पास करना वास्तव में एक विकल्प है यदि आपके पास केवल कुछ पैरा हैं। दुर्भाग्यवश, मेरे पृष्ठों पर बहुत कुछ चल रहा है, और मैं पहले से ही स्क्रिप्ट प्रबंधक इतिहास का उपयोग कर रहा हूं जो हैश मानों के साथ यूआरएल लोड करता है: इतिहास राज्य पैराम्स की बड़ी संख्या के कारण, मुझे httpRuntime maxURLLength b/c 260 में काफी वृद्धि नहीं हुई थी। इस तथ्य का जिक्र नहीं है कि सत्र में बहुत सी चीजें हैं जिन्हें हम ग्राहक को बेनकाब करने की आवश्यकता नहीं रखते हैं। – Stephen

7

यदि आपका वेब ऐप किसी सर्वर फार्म पर तैनात है (अधिकतर एक सर्वर वेब) जैसा कि आपने कहा था कि आप इनप्रोक सत्र का उपयोग कर रहे हैं और ऐसा हो सकता है कि उपयोगकर्ता उस सर्वर से एक अलग सर्वर पर रीडायरेक्ट हो उस सत्र चर संग्रहीत। इस मामले आप proc सत्र से बाहर के लिए जाना चाहिए के रूप में आप का उल्लेख किया है में (सत्र स्थिति सर्वर)

यदि आप एक राज्य सर्वर भालू मन में नीचे किसी भी अन्य मुद्दे को रोकने के लिए के लिए जाना:

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

http://www-jo.se/f.pfleger/session-lost

इस लकड़हारा पर एक नज़र समझने के लिए भी है, तो अपने इच्छा के विरुद्ध एप्लिकेशन रीसायकल:

http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

+0

यह मेरा पहला विचार भी था। हालांकि, चूंकि उन्होंने कहा था, "जब विशेष सत्र चर खो जाते हैं, उसी उपयोगकर्ता के लिए अन्य सत्र सत्रों में से अधिकांश अभी भी मौजूद हैं।", मुझे सत्र-एफ़िनिटी विफलता पर संदेह होने की संभावना कम है। – mikemanne

+1

जो हो सकता है। हो सकता है कि उपयोगकर्ता सर्वर 1 पर था (मान लें कि कुछ सत्र चर बनाए गए थे) तो अगर सर्वर 2 द्वारा अनुरोध किया जाता है और कोड उस सत्र चर तक पहुंचने का प्रयास करता है जो उस सर्वर पर मौजूद नहीं है, तो यह एक शून्य हो जाएगा संदर्भ –

+0

क्षमा करें, मुझे यह भी निर्दिष्ट करना चाहिए था .. केवल 1 सर्वर, सर्वर फार्म नहीं – Stephen

1

सत्र मुद्दों क्योंकि कई कारण

  1. सत्र समाप्ति की आप भी हो सकता है का सामना कर रहे: के रूप में आप inproc मोड का उपयोग कर रहे हैं, सत्र वैध केवल sessiontimeout TIMEPERIOD के लिए कर रहे हैं। जो डिफ़ॉल्ट रूप से 20 मिनट है। अपने वेब .config के system.web सेक्शन में सत्रस्टेट टैग का उपयोग करने का प्रयास करें और एक बड़े मान पर टाइमआउट मान सेट करें।

  2. एक और समस्या वेबफर्म और वेब बागों के कारण हो सकती है। यदि आपने अपनी वेबसाइट के लिए वेब खेतों और वेब उद्यान को कॉन्फ़िगर किया है। इनप्रोक सत्र साझाकरण समस्याएं पैदा कर सकता है।

  3. प्रक्रिया पुनरारंभ होता है: आपकी वेबसाइट की w3p प्रक्रिया कोड में कुछ समस्या के कारण पुनरारंभ हो रही है। या स्मृति रिसाव।

0

मैं इस समस्या में पड़ गए क्योंकि हमारे सर्वर https चलाने के लिए सेटअप किया गया था। अगर मैं सरल http के तहत भाग गया तो सत्रों को बनाए रखा नहीं जाएगा। हालांकि, https पर चलते समय सत्र बनाए रखा गया था। इसलिए हम http के माध्यम से आने पर https को हमेशा https पर भेजने के लिए एक URL पुनर्लेखन नियम सेट करते हैं।

इसके अलावा सत्र में स्थानीय स्तर पर या सर्वर पर काम नहीं करेगा जब तक कि आप https (https के अंत पर एस ध्यान दें) चल रहे हैं, तो आप अपने web.config फ़ाइल में निम्न अगर:

<httpCookies httpOnlyCookies="true" requireSSL="true"/> 
0

एक और शर्त वहां है जहां सत्र अपना मूल्य खो सकते हैं।

आप इस समस्या का पता लगाने के लिए फिडलर टूल का उपयोग कर सकते हैं।

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

धन्यवाद।

0

चूंकि मुझे इसे समझने में थोड़ी देर लग गई, मैंने सोचा कि अगर मैं किसी और की मदद करता हूं तो मैं इसे यहां पोस्ट करूंगा।

मैं ऐसी परिस्थिति में भाग गया जहां आईई और क्रोम यादृच्छिक रूप से सत्र चर को छोड़ रहे थे। मैंने खोज की और खोज की और हर किसी ने सामान्य चीजें कहा ... डोमेन नाम की जांच करें, कुकीज़ के लिए अपनी आईआईएस सेटिंग्स की जांच करें ... आदि।

मेरी समस्या एक अनुमति की बात साबित हुई।

मेरे web.config में, मेरे पास 'सार्वजनिक' फ़ोल्डर के लिए अनुमति प्रविष्टि है जिसे अनधिकृत सार्वजनिक द्वारा एक्सेस किया जा सकता है।

<location path="public"> 
<system.web> 
    <authorization> 
    <allow users="*" /> 
    <allow users="?" /> 
    </authorization> 
</system.web> 

समस्या एक HttpHandler कि जनता की ओर नहीं था करने के लिए कॉल .js एक सार्वजनिक-पक्ष था। कोड का पुन: उपयोग करने के प्रयास में, मैंने सुरक्षित और सार्वजनिक दोनों पक्षों को सुरक्षित पक्ष में कोड करने की ओर इशारा किया। मुझे लगता है कि एक साइड इफेक्ट के रूप में, यह बहुत ही सार्थक त्रुटि संदेश के बिना, सत्र को मार डाला।

मैं केवल उस हैंडलर के लिए एक और प्रविष्टि जोड़ सकता हूं, या मैं उस कोड की सार्वजनिक और एक सुरक्षित प्रतिलिपि बना सकता हूं (एक कम वांछित दृष्टिकोण)।

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