यदि वर्तमान ASP.NET सत्र अशक्त है तो मुझे क्या करना चाहिए?


125

अपने वेब एप्लिकेशन में, मैं सत्र चर को पढ़ने के लिए कुछ ऐसा करता हूं:

if (HttpContext.Current.Session != null &&  HttpContext.Current.Session["MyVariable"] != null)
{
    string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}

मैं समझता हूं कि यह जांचना महत्वपूर्ण क्यों है कि HttpContext.Current.Session ["MyVariable"] शून्य है (चर को सत्र में अभी तक संग्रहीत नहीं किया गया है या सत्र विभिन्न कारणों से रीसेट किया गया है), लेकिन मुझे जांच की आवश्यकता क्यों है अगर HttpContext.Current.Sessionअशक्त है

मेरी समझ यह है कि सत्र ASP.NET द्वारा स्वचालित रूप से बनाया गया है इसलिए HttpContext.Current.Session कभी भी अशक्त नहीं होना चाहिए। क्या यह धारणा सही है? यदि यह शून्य हो सकता है, तो क्या इसका मतलब यह है कि मुझे इसमें कुछ संग्रहीत करने से पहले इसकी जांच करनी चाहिए:

if (HttpContext.Current.Session != null)
{
    HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
    // What should be done in this case (if session is null)?
    // Is it possible to force the session to be created if it doesn't exist?
}

ASP.NET WebApi का अलग-अलग व्यवहार होगा, आप इसे ASP.NET वेब एपीआई का उपयोग करके सत्र की
Tiago Gouvêa

जवाबों:


158

हां, सत्र ऑब्जेक्ट शून्य हो सकता है, लेकिन केवल कुछ परिस्थितियों में, जिसे आप केवल शायद ही कभी चलाएंगे:

यदि आपके पास केवल पृष्ठों में कोड है, तो आप इसमें नहीं चलेंगे। मेरे ASP .NET कोड के अधिकांश सत्र बार-बार अशक्त किए बिना सत्र का उपयोग करते हैं। हालाँकि, यह सोचने के लिए कुछ है कि क्या आप IHttpModule विकसित कर रहे हैं या अन्यथा ASP .NET के गंभीर विवरण में नीचे हैं।

संपादित करें

टिप्पणी के जवाब में: सत्र राज्य उपलब्ध है या नहीं यह इस बात पर निर्भर करता है कि अनुरोध के लिए AcquireRequestState ईवेंट चला है या नहीं। यह वह जगह है जहां सत्र राज्य मॉड्यूल सत्र कुकी को पढ़कर और आपके लिए सत्र चर का एप्रिपेट सेट ढूंढकर काम करता है।

AcquireRequestState आपके पेज पर नियंत्रण से पहले चलता है। इसलिए यदि आप अपने पृष्ठ से स्थिर कक्षाओं सहित अन्य कार्यक्षमता को बुला रहे हैं, तो आपको ठीक होना चाहिए।

यदि आपके पास स्टार्टअप के दौरान आरंभीकरण तर्क करने वाले कुछ वर्ग हैं, उदाहरण के लिए Application_Start इवेंट पर या स्थिर कंस्ट्रक्टर का उपयोग करके, सत्र स्थिति उपलब्ध नहीं हो सकती है। यह सब इस बात पर उबलता है कि क्या कोई वर्तमान अनुरोध है और AcquireRequestState चलाया गया है।

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


6
बस एक त्वरित अद्यतन मुझे आज मिला। पेज कंस्ट्रक्टर पर सत्र उपलब्ध नहीं है! केवल Init इवेंट पर या उसके बाद।
नूनो अगापिटो

मुझे अभी-अभी HttpContext.Current.Session == null का सामना करना पड़ा है, जिसे मास्टर पेज के Page_Load ईवेंट द्वारा कोड कहा जाता है। जाहिर है, यह एक पृष्ठ के संदर्भ में हो सकता है। अगर मैं HttpContext.Current ऑब्जेक्ट का निरीक्षण करता हूं, तो इसके अधिकांश सदस्य आरंभीकृत होते हैं, लेकिन CurrentNotification और IsPostNotification एक त्रुटि फेंकते हैं: {System.PlatformNotSupportedException}। कारण जो भी हो, यह मुद्दा उत्पादन में नहीं हुआ है, जहां यह वर्षों से चला आ रहा है। प्लेटफ़ॉर्म Windows Server 2003 R2 SP2 है, अनुप्रयोग में लक्ष्य .Net 3.5 है और IIS में सत्र स्थिति सक्षम के साथ चलता है।
आर। श्रेयर्स

मैंने यह भी पाया है कि जब IIS डिस्क पर मौजूद एक संसाधन फ़ाइल के लिए प्रत्यक्ष अनुरोध परोस रहा है, जैसे कि स्टाइल शीट, तो HttpContext.Current.Session'Application_AcquireRequestState' में कोड करने के लिए शून्य हो सकता है। हालाँकि, पृष्ठ के लिए अनुरोध, सत्र वस्तु को कोड के लिए उपलब्ध कराता है। यह MVC.NET 4 के तहत कम से कम है।
ingredient_15939

मुझे लगता है कि अगर आप आउटपुट-कैश्ड MVC एक्शन के अंदर हैं तो यह भी शून्य हो सकता है।
user2173353

40

निम्नलिखित कथन पूरी तरह से सही नहीं है:

"इसलिए यदि आप अपने पृष्ठ से स्थैतिक कक्षाओं सहित अन्य कार्यक्षमता को बुला रहे हैं, तो आपको ठीक होना चाहिए"

मैं एक स्थैतिक विधि कह रहा हूं जो सत्र को HttpContext.Current.Session के माध्यम से संदर्भित करता है और यह अशक्त है। हालाँकि, मैं jQuery का उपयोग करके ajax के माध्यम से एक webservice विधि के माध्यम से विधि को बुला रहा हूं।

जैसा कि मैंने यहां पाया कि आप विधि पर एक साधारण विशेषता के साथ समस्या को ठीक कर सकते हैं, या वेब सेवा सत्र ऑब्जेक्ट का उपयोग कर सकते हैं:

हालाँकि, एक ट्रिक में सेशन स्टेट को एक्सेस करने के लिए एक ट्रिक है, आपको सेशन स्टेट मैनेजमेंट को एनेबल करना होगा:

[WebMethod (EnableSession = true)]

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

समाधान के लिए मैथ्यू कोजियर को धन्यवाद।

बस मैंने सोचा कि मैं अपने दो सेंट जोड़ूंगा।

ईडी


1
धन्यवाद एड, सत्र वेबमिथोड में अशक्त के रूप में दिखाई दे रहा था - इसे तय किया। +1
फुस्सी

1
ठीक है, जब आप एक webservice में कॉल कर रहे हैं, तो आप पृष्ठ की तुलना में एक और अनुरोध का उपयोग करते हैं, ताकि बयान अभी भी सही हो, आईएमओ।
डेक्टिस

MSDN डॉक्स यहाँ - the default value is false। एक जादू की तरह काम करता है।
बेन्जीनर

22

यदि आपका सत्र उदाहरण अशक्त है और 'एशक्स' फ़ाइल में है, तो बस 'IRequiresSessionState' इंटरफ़ेस लागू करें।

इस इंटरफ़ेस में कोई सदस्य नहीं है, इसलिए आपको कक्षा घोषणा (C #) के बाद इंटरफ़ेस नाम जोड़ने की आवश्यकता है:

public class MyAshxClass : IHttpHandler, IRequiresSessionState

बहुत बहुत धन्यवाद, सत्र मेरे लॉगिन वर्ग में शून्य था। जब मैंने इस कोड को अपने ashx हैंडलर में जोड़ा तो यह मेरी कक्षा में भी सत्र चालू हो गया
Ateş Danış

मुझे लगता है कि यह सवाल का जवाब काफी अच्छी तरह से देता है। बहुत बहुत धन्यवाद।
सचिन जोसेफ

2

ASP.NET तकनीकी लेख

सारांश: ASP.NET में, हर वेब पेज System.Web.UI.Page क्लास से प्राप्त होता है। पृष्ठ वर्ग सत्र डेटा के लिए HttpSession ऑब्जेक्ट का एक उदाहरण एकत्र करता है। पृष्ठ वर्ग अनुकूलन के लिए विभिन्न घटनाओं और विधियों को उजागर करता है। विशेष रूप से, OnInit विधि का उपयोग पेज ऑब्जेक्ट की प्रारंभिक स्थिति को सेट करने के लिए किया जाता है। यदि अनुरोध में सत्र कुकी नहीं है, तो एक नया सत्र कुकी आवश्यककर्ता को जारी किया जाएगा।

संपादित करें:

सत्र: शुरुआती लोगों के लिए एक अवधारणा

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


2

मेरे मामले ASP.NET State Serviceमें रोक दिया गया था। पहली बार मैन्युअल रूप से सेवा Startup typeको बदलना Automaticऔर शुरू करना

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