ASP.NET में किसी भी वर्ग से सत्र चर का उपयोग कैसे करें?


157

मैंने अपने आवेदन में App_Code फ़ोल्डर में एक वर्ग फ़ाइल बनाई है। मेरे पास एक सत्र चर है

Session["loginId"]

मैं अपनी कक्षा में इस सत्र चर का उपयोग करना चाहता हूं, लेकिन जब मैं निम्नलिखित पंक्ति लिख रहा हूं तब यह त्रुटि देता है

Session["loginId"]

क्या कोई मुझे बता सकता है कि ASP.NET 2.0 (C #) में app_code फ़ोल्डर में बनाए गए एक वर्ग के भीतर सत्र चर का उपयोग कैसे किया जाए

जवाबों:


363

(पूर्णता के लिए अद्यतित)
आप किसी भी पेज से सत्र चर का उपयोग कर सकते हैं या Session["loginId"]किसी वर्ग से (जैसे कक्षा पुस्तकालय के अंदर से) का उपयोग करके नियंत्रण कर सकते हैं ,System.Web.HttpContext.Current.Session["loginId"].

लेकिन मेरे मूल उत्तर के लिए कृपया पर पढ़ें ...


मैं हमेशा ASP.NET सत्र के आसपास एक आवरण वर्ग का उपयोग सत्र चर तक पहुंच को आसान बनाने के लिए करता हूं:

public class MySession
{
    // private constructor
    private MySession()
    {
      Property1 = "default value";
    }

    // Gets the current session.
    public static MySession Current
    {
      get
      {
        MySession session =
          (MySession)HttpContext.Current.Session["__MySession__"];
        if (session == null)
        {
          session = new MySession();
          HttpContext.Current.Session["__MySession__"] = session;
        }
        return session;
      }
    }

    // **** add your session properties here, e.g like this:
    public string Property1 { get; set; }
    public DateTime MyDate { get; set; }
    public int LoginId { get; set; }
}

यह वर्ग ASP.NET सत्र में स्वयं का एक उदाहरण संग्रहीत करता है और आपको अपने सत्र गुणों को किसी भी वर्ग से टाइप-सुरक्षित तरीके से एक्सेस करने की अनुमति देता है, जैसे:

int loginId = MySession.Current.LoginId;

string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;

DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;

इस दृष्टिकोण के कई फायदे हैं:

  • यह आपको कई प्रकार के कास्टिंग से बचाता है
  • आपको अपने आवेदन के दौरान हार्ड-कोडेड सत्र कुंजियों का उपयोग करने की आवश्यकता नहीं है (उदाहरण सत्र ["loginId")
  • आप MySession के गुणों पर XML doc टिप्पणियों को जोड़कर अपने सत्र आइटमों को दस्तावेज़ित कर सकते हैं
  • आप अपने सत्र चर को डिफ़ॉल्ट मानों के साथ आरंभ कर सकते हैं (उदाहरण के लिए आश्वस्त करना कि वे अशक्त नहीं हैं)

6
किसी भी कोड को लिखने की आवश्यकता नहीं है, जैसा कि उत्तर में दिखाया गया है। जैसे "सार्वजनिक int LoginId {get; सेट;};" -> इसे एक स्वचालित संपत्ति कहा जाता है।
M4N

4
यदि आप .net 3.x का उपयोग कर रहे हैं, तो आप मेरे कोड में दिखाए गए अनुसार स्वचालित गुणों का उपयोग कर सकते हैं। .Net 2.x / 1.x के साथ यह उपलब्ध नहीं है और आपको अपने गुणों के गेटटर / सेटर को स्वयं लागू करना होगा: निजी int _loginId; सार्वजनिक int LoginId {get {वापसी _loginId; } सेट {_loginId = मूल्य; }}
M4N

2
अब अच्छा लग रहा है, मुझे लगता है कि मुझे अपनी समस्या का जवाब मिल गया है, और मैं आपके रास्ते का उपयोग कर रहा हूं, यह बहुत ही साफ है और मेरे सभी सत्र चर को एक स्थान पर बनाए रखना आसान है। धन्यवाद @Martin, आप भयानक हैं।
प्रशांत

23
@ M4N, काश मैं +1 से थोड़ा अधिक आभार व्यक्त कर सकता था। यह मेरी परियोजनाओं में सत्र / कैश से निपटने का मेरा पसंदीदा तरीका बन गया है। मेरा कोड, सचमुच, आपको धन्यवाद दे रहा है।
ब्रैंडन बून

4
@ क्रिस्‍टोफर जबकि 'करंट' प्रॉपर्टी स्‍टैटिक है MySession का उदाहरण वापस नहीं है ... इसलिए यह ठीक है। इस तरह से उपयोग करने के लिए स्थिर तरीके और गुण सुरक्षित हैं।
डैरेन

104

सूत्र के माध्यम से सत्र तक पहुँचें HttpContext: -

HttpContext.Current.Session["loginId"]

इस सरल कदम के लिए एक टन एंथोनी धन्यवाद।
किंग्स

एक बहुत एंथोनी, + 1 के लिए धन्यवाद
ओवैस कुरैशी

धन्यवाद। भूल गए कि क्या नाम था :)
एंथनी हॉर्न

@AnthonyWJones मैंने आपकी पद्धति का उपयोग किया है, लेकिन समस्या है, क्या आप मुझे समझा सकते हैं, कि मैं कहां गलत हूं या उपयोग करने का उचित तरीका क्या है, मेरा प्रश्न stackoverflow.com/questions/45254279/…
adnan

और यदि आप HttpSessionStateBase में परिवर्तित करना चाहते हैं: HttpSessionStateBase सत्र = नया HttpSessionStateWrapper (HttpContext.Current.Session); पुनः: stackoverflow.com/questions/5447611/…
sobelito

24

सुझाए गए समाधान के साथ समस्या यह है कि यदि आप एक आउट-ऑफ-प्रोसेस प्रक्रिया स्टोरेज का उपयोग कर रहे हैं तो यह SessionState में निर्मित कुछ प्रदर्शन सुविधाओं को तोड़ सकता है। (या तो "स्टेट सर्वर मोड" या "एसक्यूएल सर्वर मोड")। ऑप मोड में सत्र डेटा को पृष्ठ अनुरोध के अंत में क्रमबद्ध किया जाना चाहिए और पृष्ठ अनुरोध की शुरुआत में इसे निष्क्रिय कर दिया जाना चाहिए, जो महंगा हो सकता है। प्रदर्शन में सुधार करने के लिए SessionState केवल deserialize वैरिएबल की जरूरत है, जब इसे पहली बार एक्सेस किया जाता है, और यह केवल फिर से serializes और बदले गए वेरिएबल को बदल देता है। यदि आपके पास सत्र चर का एक बहुत कुछ है और उन सभी को एक कक्षा में अनिवार्य रूप से अलग-थलग कर दें, तो आपके सत्र में सब कुछ प्रत्येक पृष्ठ अनुरोध पर deserialized होगा जो सत्र का उपयोग करता है और सब कुछ फिर से क्रमबद्ध होने की आवश्यकता होगी, भले ही केवल 1 गुण परिवर्तित वर्ग को बदल दिया हो। बस कुछ इस पर विचार करें कि क्या आपके सत्र का उपयोग और एक ऊप मोड।


4
इसको पूरा करने के लिए +1। यदि आप सत्र के लिए InProc का उपयोग नहीं कर रहे हैं, तो Ernie 100% सही है। InProc वैसे भी बहुत सीमित है, क्योंकि यह वेबफ़ार्म्स का समर्थन नहीं करता है और यदि एप्लिकेशन फिर से शुरू होता है तो यह खो जाएगा। ध्यान दें, प्रदर्शन लागत द्वारा हम स्टेट सर्वर मोड का उपयोग करते हुए 20% प्रीमियम देख रहे हैं, और इसके ऊपर क्रमिक लागत जोड़ी जाती है। जैसा कि आप सोच सकते हैं कि यह महंगा हो सकता है। आप आदिम प्रकार (जैसे इंट, स्ट्रिंग, चार, बाइट, आदि) से चिपके हुए कुछ सीरियलाइज़ेशन ओवरहेड से बच सकते हैं। कस्टम ऑब्जेक्ट्स को क्रमांकन के साथ सामना किया जाएगा। उपयोगकर्ता सावधान रहें।
ज़ैक जैनसेन

+1 अच्छी बात। एक बदलाव जो दो अवधारणाओं से विवाह करेगा, वह होगा इस प्रथा "सत्र" पर प्रत्येक संपत्ति के लिए सत्र में एक बड़ी वस्तु के बजाय asp.net सत्र को कॉल करें। टाइप कास्टिंग करना है कि @ M4N के दृष्टिकोण से बचा जाता है, लेकिन शायद इसके लायक है यदि आप प्रत्येक बार केवल कुछ सत्र पढ़ते हैं।
इल

12

मेरे सामने प्रस्तुत जवाब समस्या का उपयुक्त समाधान प्रदान करते हैं, हालांकि, मुझे लगता है कि यह समझना महत्वपूर्ण है कि यह त्रुटि क्यों होती है:

उस विशेष अनुरोध के सापेक्ष रिटर्न की Sessionसंपत्ति Pageएक प्रकार का उदाहरण है HttpSessionStatePage.Sessionवास्तव में कॉलिंग के बराबर है Page.Context.Session

MSDN बताता है कि यह कैसे संभव है:

क्योंकि ASP.NET पृष्ठों में System.Web namespace (जिसमें HttpContextवर्ग शामिल है ) का एक डिफ़ॉल्ट संदर्भ होता है , आप HttpContextपूरी तरह से योग्य वर्ग संदर्भ के बिना .aspx पृष्ठ पर सदस्यों का संदर्भ ले सकते हैं HttpContext

हालाँकि, जब आप इस प्रॉपर्टी को App_Code में एक वर्ग के भीतर एक्सेस करने का प्रयास करते हैं, तो प्रॉपर्टी आपको तब तक उपलब्ध नहीं होगी जब तक कि आपकी क्लास पेज क्लास से नहीं निकलती।

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


यह बहुत अच्छी व्याख्या है, इसने मुझे इसके लिए +1 की मदद की :)
ओवैस कुरैशी

1

मेरे पास एक ही त्रुटि थी, क्योंकि मैं एक कस्टम सत्र वर्ग के अंदर सत्र चर को हेरफेर करने की कोशिश कर रहा था।

मुझे वर्तमान संदर्भ (system.web.httpcontext.current) को कक्षा में पास करना था, और फिर सब कुछ ठीक हो गया।

एमए


1

Asp.net कोर में यह अलग तरीके से काम करता है:

public class SomeOtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void TestSet()
    {
        _session.SetString("Test", "Ben Rules!");
    }

    public void TestGet()
    {
        var message = _session.GetString("Test");
    }
}

स्रोत: https://benjii.me/2016/07/using-session-and-httpcontext-in-aspnetcore-and-mvc-core/


0

यह आवेदन के लिए और डेवलपर के लिए भी अधिक कुशल होना चाहिए।

अपने वेब प्रोजेक्ट में निम्न वर्ग जोड़ें:

/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
    HttpContext.Current.Session[sessionName] = value;
}

protected internal static T Get<T>(string sessionName)
{
    return (T)HttpContext.Current.Session[sessionName];
}

public static int? WhatEverSessionVariableYouWantToHold
{
    get
    {
        return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
    }
    set
    {
        Save(nameof(WhatEverSessionVariableYouWantToHold), value);
    }
}

}

यहाँ कार्यान्वयन है:

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