2009-09-05 12 views
104

अपने वेब आवेदन में, मैं सत्र चर को पढ़ने के लिए कुछ इस तरह करते हैं:यदि वर्तमान एएसपी.NET सत्र शून्य है तो मुझे क्या करना चाहिए?

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

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

मेरी समझ यह है कि सत्र स्वचालित रूप से एएसपी.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? 
} 
+0

ASP.NET WebAPI विभिन्न व्यवहार होगा, आप इसे [एक्सेस करना सत्र ASP.NET वेब API का उपयोग करना] (http://stackoverflow.com/questions/9594229/accessing-session-using पर देख सकते हैं -asp-net-web-api? answertab = वोट # टैब-टॉप) –

उत्तर

135

हाँ , सत्र वस्तु शून्य हो सकती है, लेकिन केवल कुछ परिस्थितियों में, जो यो अपने कोड HttpApplication.AcquireRequestState घटना से पहले चलाता है आप SessionState http module निष्क्रिय कर दिया है तो

  • , सत्र पूरी तरह
  • अक्षम करने: यू यदा-कदा ही में चलेंगे।
  • आपका कोड IHttpHandler में चलता है, जो IRequiresSessionState या IReadOnlySessionState इंटरफ़ेस निर्दिष्ट नहीं करता है।

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

संपादित

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

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

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

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

+4

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

+0

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

+0

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

2

ASP.NET Technical Articles

SUMMARY: In ASP.NET, every Web page derives from the System.Web.UI.Page class. The Page class aggregates an instance of the HttpSession object for session data. The Page class exposes different events and methods for customization. In particular, the OnInit method is used to set the initialize state of the Page object. If the request does not have the Session cookie, a new Session cookie will be issued to the requester.

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

Session: A Concept for Beginners

SUMMARY: Session is created when user sends a first request to the server for any page in the web application, the application creates the Session and sends the Session ID back to the user with the response and is stored in the client machine as a small cookie. So ideally the "machine that has disabled the cookies, session information will not be stored".

15

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

public class MyAshxClass : IHttpHandler, IRequiresSessionState 
+2

अपलोडिफ़ अपलोड स्क्रिप्ट के साथ, मेरे लिए काम किया, धन्यवाद। – Renan

+0

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

+0

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

38

निम्नलिखित बयान पूरी तरह से सही नहीं है:

"So if you are calling other functionality, including static classes, from your page, you should be fine"

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

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

के रूप में मुझे पता चला here आप विधि पर एक साधारण विशेषता के साथ समस्या को ठीक कर सकते हैं, या वेब सेवा सत्र वस्तु का उपयोग करें: समाधान के लिए मैथ्यू cozier को

There’s a trick though, in order to access the session state within a web method, you must enable the session state management like so:

[WebMethod(EnableSession = true)]

By specifying the EnableSession value, you will now have a managed session to play with. If you don’t specify this value, you will get a null Session object, and more than likely run into null reference exceptions whilst trying to access the session object.

धन्यवाद।

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

एड

+1

धन्यवाद एड, सत्र वेबमाइट में शून्य के रूप में दिखाई दे रहा था - इसे जोड़कर इसे ठीक किया गया। +1 – fusi

+1

ठीक है, जब आप किसी webservice में कॉल कर रहे हैं, तो आप पेज के मुकाबले एक और अनुरोध का उपयोग करते हैं, ताकि कथन अभी भी सही हो, आईएमओ। – driis

+0

एमएसडीएन दस्तावेज़ [यहां] (http://msdn.microsoft.com/en-us/library/byxd99hx%28v=vs.90%29.aspx#vbtskusingwebmethodattributeenablesession) - 'डिफ़ॉल्ट मान गलत है'। एक जादू की तरह काम करता है। – benjineer

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

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