सत्र चर का निर्धारण करने का सबसे अच्छा तरीका क्या है C #?


79

ASP.NET C # में सत्र चर के अस्तित्व की जांच करने का सबसे अच्छा तरीका क्या है?

मैं String.IsNullOrEmpty()स्ट्रिंग्स के लिए कार्यों का उपयोग करना पसंद करता हूं और सोचता हूं कि क्या इसके लिए एक समान विधि थी Session। वर्तमान में एकमात्र तरीका मुझे पता है:

 var session;
 if (Session["variable"] != null)
 {
     session = Session["variable"].ToString();
 }
 else
 {
     session = "set this";
     Session["variable"] = session;
 }

जवाबों:


114

दूसरों ने जो कहा है, उसका पालन करना। मेरी दो परतें हैं:

कोर परत। यह एक DLL के भीतर है जो लगभग सभी वेब ऐप परियोजनाओं में जोड़ा जाता है । इसमें मेरे पास एक सत्रवार वर्ग है जो सत्र राज्य पाने वालों / बसने वालों के लिए गंभीर काम करता है। इसमें निम्नलिखित जैसे कोड शामिल हैं:

public class SessionVar
{
    static HttpSessionState Session
    {
        get
        {
            if (HttpContext.Current == null)
                throw new ApplicationException("No Http Context, No Session to Get!");

            return HttpContext.Current.Session;
        }
    }

    public static T Get<T>(string key)
    {
        if (Session[key] == null)
            return default(T);
        else
            return (T)Session[key];
    }

    public static void Set<T>(string key, T value)
    {
        Session[key] = value;
    }
}

किसी भी प्रकार को प्राप्त करने के लिए जेनरिक पर ध्यान दें।

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

उदाहरण के लिए:

public static string GetString(string key)
{
    string s = Get<string>(key);
    return s == null ? string.Empty : s;
}

public static void SetString(string key, string value)
{
    Set<string>(key, value);
}

और इसी तरह...

फिर मैं दूर करने के लिए रैपर बनाता हूं और इसे एप्लिकेशन मॉडल तक लाता हूं। उदाहरण के लिए, यदि हमारे पास ग्राहक का विवरण है:

public class CustomerInfo
{
    public string Name
    {
        get
        {
            return SessionVar.GetString("CustomerInfo_Name");
        }
        set
        {
            SessionVar.SetString("CustomerInfo_Name", value);
        }
    }
}

आपको सही अंदाजा है? :)

नोट: स्वीकृत उत्तर के लिए एक टिप्पणी जोड़ते समय बस एक विचार था। राज्य सर्वर का उपयोग करते समय हमेशा वस्तुओं को क्रम में रखना सुनिश्चित करें जब उन्हें सत्र में संग्रहीत किया जाता है। वेब फ़ार्म पर जाने पर जेनरिक का उपयोग करके किसी ऑब्जेक्ट को सहेजने और सहेजने के लिए यह सब बहुत आसान हो सकता है। मैं काम पर एक वेब फ़ार्म पर तैनात हूं, इसलिए मेरे कोड में कोर लेयर में चेक जोड़े जाएं ताकि यह पता चल सके कि ऑब्जेक्ट सीरियस है या नहीं, सैशन गेटर्स और सेटर्स को एन्कैप्सुलेट करने का एक और फायदा :)


महान दृष्टिकोण! मैं लंबे समय से कुछ इसी तरह का उपयोग कर रहा था, लेकिन जेनरिक को शामिल नहीं किया था। यह अलग-अलग डेवलपर्स के साथ समान सत्र चर बनाने के साथ कई समस्याओं से बचा जाता है।
DOK

अगर मैं "नए ApplicationException (" कोई Http संदर्भ, कोई मंदी नहीं मिल सकता है! "), तो मैं अपवादों को कैसे संभाल सकता हूं? निष्पादित किया जाता है?, मैं ऑटो-कार्यान्वित गुणों के बारे में भ्रमित कर रहा हूं, कोड के विच भाग में मुझे तब अपवाद मिल सकता है जब ऐसा होता है।
Marztres

अच्छा तरीका। मुझे इसे C # क्लास लाइब्रेरी में लागू करने में परेशानी हो रही है। मैं HttpSessionState/ के संदर्भ नहीं हल कर सकता HttpContext। क्या आपको उचित नामस्थानों को आयात करने के लिए DLL में MVC लाइब्रेरी स्थापित करनी थी?
देखिए बिस्किट

18

यह बहुत ज्यादा है कि आप इसे कैसे करते हैं। हालाँकि, एक छोटा वाक्यविन्यास है जिसका आप उपयोग कर सकते हैं।

sSession = (string)Session["variable"] ?? "set this";

यह कह रहा है कि यदि सत्र चर शून्य है, तो सत्र को "इसे सेट करें" पर सेट करें


1
आप ऐसा नहीं कर सकते ... सत्र ["चर"] एक वस्तु है और संकलक फिर इसे एक स्ट्रिंग में बदल देगा क्योंकि सत्र एक स्ट्रिंग है, यदि सत्र ["चर" मौजूद नहीं है, तो यह एक अपवाद फेंकता है !
balexandre

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

14

यह एक संपत्ति में लपेटने के लिए चीजों को और अधिक सुरुचिपूर्ण बना सकता है।

string MySessionVar
{
   get{
      return Session["MySessionVar"] ?? String.Empty;
   }
   set{
      Session["MySessionVar"] = value;
   }
}

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

if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}

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

क्या होगा यदि आप सत्र में एक वस्तु का भंडारण कर रहे हैं और न केवल एक स्ट्रिंग?
आरोन पामर

1
मेरा उत्तर देखें, अन्य वस्तुओं का भंडारण करते समय जेनरिक का उपयोग प्रकार-सुरक्षा को सक्षम बनाता है।
रोब कूपर

क्षमा करें, 'सत्र है ("भाग सही है! मुझे त्रुटियां हो रही हैं।
यीशु ज़मोरा

यह VB में होगा। :) वर्ग कोष्ठक में बदल दिया।
ग्रेग ओगल

8

C # 3.0 में 'as' नोटेशन बहुत साफ है। चूँकि सभी सत्र चर अशक्त वस्तुएं हैं, इससे आप मूल्य को पकड़ सकते हैं और बिना किसी अपवाद के चिंता किए बिना इसे अपने स्वयं के टाइप किए गए चर में डाल सकते हैं। अधिकांश वस्तुओं को इस तरह से संभाला जा सकता है।

string mySessionVar = Session["mySessionVar"] as string;

मेरी अवधारणा यह है कि आपको अपने सत्र चर को स्थानीय चर में खींचना चाहिए और फिर उन्हें उचित रूप से संभालना चाहिए। हमेशा मान लें कि आपके सत्र चर शून्य हो सकते हैं और उन्हें कभी भी अशक्त प्रकार में नहीं डाला जा सकता है।

यदि आपको एक गैर-शून्य टाइप किए गए चर की आवश्यकता है तो आप इसे प्राप्त करने के लिए TryParse का उपयोग कर सकते हैं।

int mySessionInt;
if (!int.TryParse(mySessionVar, out mySessionInt)){
   // handle the case where your session variable did not parse into the expected type 
   // e.g. mySessionInt = 0;
}

2

मेरी राय में, ऐसा करने का सबसे आसान तरीका स्पष्ट और पढ़ने में आसान है:

 String sVar = (string)(Session["SessionVariable"] ?? "Default Value");

यह सबसे अधिक प्रभावी तरीका नहीं हो सकता है, क्योंकि यह डिफ़ॉल्ट के मामले में भी डिफ़ॉल्ट स्ट्रिंग कास्ट करता है (स्ट्रिंग को स्ट्रिंग के रूप में कास्टिंग), लेकिन यदि आप इसे एक मानक कोडिंग अभ्यास बनाते हैं, तो आप पाते हैं कि यह सभी डेटा प्रकारों के लिए काम करता है, और आसानी से पठनीय है।

उदाहरण के लिए (पूरी तरह से फर्जी उदाहरण, लेकिन यह बात दिखाता है):

 DateTime sDateVar = (datetime)(Session["DateValue"] ?? "2010-01-01");
 Int NextYear = sDateVar.Year + 1;
 String Message = "The Procrastinators Club will open it's doors Jan. 1st, " +
                  (string)(Session["OpeningDate"] ?? NextYear);

मुझे जेनरिक विकल्प पसंद है, लेकिन यह ओवरकिल की तरह लगता है जब तक कि आपको पूरे स्थान पर इसकी आवश्यकता न हो। एक्सटेंशन विधि को विशेष रूप से सत्र ऑब्जेक्ट को विस्तारित करने के लिए संशोधित किया जा सकता है ताकि इसमें सत्र "Sring.SfringIfNull (" SessionVar ") और सत्र [" SessionVar "] =" myval "की तरह" सुरक्षित "विकल्प मिल सके; यह सत्र ["SessionVar"] के माध्यम से चर को एक्सेस करने की सादगी को तोड़ता है, लेकिन यह साफ कोड है, और फिर भी यदि आवश्यक हो तो शून्य या यदि स्ट्रिंग को मान्य करने की अनुमति देता है।


1

कुछ भी नहीं करने के लिए जाँच / अशक्त यह करने का तरीका है।

वस्तु प्रकारों से निपटना जाने का तरीका नहीं है। एक सख्त प्रकार की घोषणा करें और वस्तु को सही प्रकार से डालने का प्रयास करें। (और कास्ट संकेत या कन्वर्ट का उपयोग करें)

 private const string SESSION_VAR = "myString";
 string sSession;
 if (Session[SESSION_VAR] != null)
 {
     sSession = (string)Session[SESSION_VAR];
 }
 else
 {
     sSession = "set this";
     Session[SESSION_VAR] = sSession;
 }

किसी भी वाक्यविन्यास उल्लंघन के लिए क्षमा करें, मैं एक दैनिक VB'er हूं


1

आमतौर पर मैं सत्र में वस्तुओं के लिए दृढ़ता से टाइप की गई संपत्तियों के साथ सत्रप्रॉक्सी बनाता हूं। इन गुणों तक पहुँचने वाला कोड शून्यता की जाँच करता है और कास्टिंग को उचित प्रकार से करता है। इसके बारे में अच्छी बात यह है कि मेरे सत्र संबंधी सभी सामान एक ही स्थान पर रखे गए हैं। मुझे कोड के विभिन्न भागों में विभिन्न कुंजियों का उपयोग करने के बारे में चिंता करने की ज़रूरत नहीं है (और सोचें कि यह काम क्यों नहीं करता है)। और निर्भरता इंजेक्शन और मॉकिंग के साथ मैं पूरी तरह से इकाई परीक्षणों के साथ इसका परीक्षण कर सकता हूं। अगर DRY सिद्धांतों का पालन करता है और मुझे उचित चूक को परिभाषित करने की भी अनुमति देता है।

public class SessionProxy
{
    private HttpSessionState session; // use dependency injection for testability
    public SessionProxy( HttpSessionState session )
    {
       this.session = session;  //might need to throw an exception here if session is null
    }

    public DateTime LastUpdate
    {
       get { return this.session["LastUpdate"] != null
                         ? (DateTime)this.session["LastUpdate"] 
                         : DateTime.MinValue; }
       set { this.session["LastUpdate"] = value; }
    }

    public string UserLastName
    {
       get { return (string)this.session["UserLastName"]; }
       set { this.session["UserLastName"] = value; }
    }
}

1

मुझे संपत्तियों में सत्र चर को लपेटना भी पसंद है। यहाँ के निवासी तुच्छ हैं, लेकिन मुझे प्राप्त करने के तरीके लिखना पसंद है, इसलिए उनके पास केवल एक निकास बिंदु है। ऐसा करने के लिए, मैं आमतौर पर शून्य के लिए जाँच करता हूं और सत्र चर के मान को वापस करने से पहले इसे डिफ़ॉल्ट मान पर सेट करता हूं। कुछ इस तरह:

string Name
{
   get 
   {
       if(Session["Name"] == Null)
           Session["Name"] = "Default value";
       return (string)Session["Name"];
   }
   set { Session["Name"] = value; }
}

}


1

यह विधि यह भी नहीं मानती है कि सत्र चर में ऑब्जेक्ट एक स्ट्रिंग है

if((Session["MySessionVariable"] ?? "").ToString() != "")
    //More code for the Code God

इसलिए मूल रूप से रिक्त चर को स्ट्रिंग में परिवर्तित करने से पहले रिक्त स्ट्रिंग के साथ बदल देता है क्योंकि ToStringयह Objectकक्षा का हिस्सा है


0

यदि आप जानते हैं कि यह एक स्ट्रिंग है, तो आप String.IsEmptyOrNull () फ़ंक्शन का उपयोग कर सकते हैं।


0

क्या आप .NET 3.5 का उपयोग कर रहे हैं? एक IsNull एक्सटेंशन विधि बनाएँ:

public static bool IsNull(this object input)
{
    input == null ? return true : return false;
}

public void Main()
{
   object x = new object();
   if(x.IsNull)
   {
      //do your thing
   }
}

1
यह लिखा जा सकता है: सार्वजनिक स्टेटिक बूल (यह ऑब्जेक्ट इनपुट) {रिटर्न इनपुट == अशक्त; }
जेम्स कर्रन

आपको विस्तार विधियों से सावधान रहना चाहिए।
क्रिस पिसेट्समैन

1
मुझे विस्तार विधियों से सावधान क्यों रहना चाहिए?
माइकल निस्कर्न

क्यों न आप बस x == null या x! = null का उपयोग करें?
बेनोइट

0

इस तरह से यह जांचा जा सकता है कि क्या इस तरह की कुंजी उपलब्ध है

if (Session.Dictionary.ContainsKey("Sessionkey"))  --> return Bool
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.