ASP.NET MVC 4 अनुप्रयोग में सत्रों का उपयोग कैसे करें?


113

मैं ASP.NET MVC में नया हूं। मैंने पहले PHP का उपयोग किया है और सत्र बनाना और वर्तमान सत्र चर के आधार पर उपयोगकर्ता रिकॉर्ड का चयन करना आसान था।

मैंने एक सरल चरण-दर-चरण ट्यूटोरियल के लिए इंटरनेट पर हर जगह देखा है जो मुझे दिखा सकता है कि मैं अपने C # ASP.NET MVC 4 एप्लिकेशन में सत्र कैसे बना और उपयोग कर सकता हूं। मैं उपयोगकर्ता चर के साथ एक सत्र बनाना चाहता हूं जिसे मैं अपने नियंत्रकों में कहीं से भी एक्सेस कर सकता हूं और अपने लिनियर प्रश्नों में चर का उपयोग करने में सक्षम हो सकता हूं।



जवाबों:


160

प्रयत्न

//adding data to session
//assuming the method below will return list of Products

var products=Db.GetProducts();

//Store the products to a session

Session["products"]=products;

//To get what you have stored to a session

var products=Session["products"] as List<Product>;

//to clear the session value

Session["products"]=null;

3
धन्यवाद अय्यूब! यू ने मुझे एक विचार दिया! बस सोच रहा था .., यह लॉगिन के दौरान एक सत्र के लिए उपयोगकर्ता चर जोड़ने के लिए संभव है? और क्या मैं अपने आवेदन में विभिन्न नियंत्रकों में सत्र चर (केवल एक बार बनाया गया) तक पहुंच पाऊंगा?
थुटो पॉल गोटिंगवे

31
आप एक सत्र में किसी भी प्रकार के कुछ या किसी भी डेटा को स्टोर कर सकते हैं। एक बार बनाने के बाद आप इसे सभी विचारों और नियंत्रकों के लिए संग्रहीत मान तक पहुंचा सकते हैं। ध्यान रखें कि बनाया गया सत्र केवल प्रति उपयोगकर्ता और प्रति ब्राउज़र तक ही पहुँचा जा सकता है। मतलब फ़ायरफ़ॉक्स का उपयोग करके User1 द्वारा बनाया गया सत्र IE का उपयोग करके उसी उपयोगकर्ता द्वारा एक्सेस नहीं किया जा सकता है। ऐसी चीजें भी हैं जिन्हें आपको सत्र के साथ नहीं करना चाहिए जैसे कि। उस पर बड़े डेटा को स्टोर न करें। यह आपके सर्वर के प्रदर्शन को धीमा कर सकता है। अंत में पासवर्ड या क्रेडिट कार्ड नंबर जैसे सत्र के लिए संवेदनशील डेटा को स्टोर न करें
जॉब एननामो

2
एक बार फिर धन्यवाद! मैं इसे विभिन्न नियंत्रकों में उपयोग करने में सक्षम होने के लिए कहां से बनाऊं?
थुटो पॉल गोटिंगवे

2
@JobertEnamno उस मूल्य को संग्रहीत करना सुरक्षित है जो इससे आता है, WebSecurity.CurrentUserIdइसे कई बार डेटाबेस से नहीं खींचता है (मुझे पता चला कि यह बहुत महंगा है)?
एंड्रियस नरुसेवीसियस

2
जब आप किसी अन्य नियंत्रक से अनुरोध करते हैं तो कोई क्रॉस कंट्रोलर सत्र नहीं होता है, उदाहरण के Account/LogOnलिए Home/Index, Session["FirstName"]है null। डेवलपर्स को एक पेरेंट कंट्रोलर ( BaseController) बनाना है और एक संरक्षित क्षेत्र ( internal protected HttpSessionStateBase SharedSession) को परिभाषित करना है जो सभी उप नियंत्रकों में साझा सत्र चर को उजागर कर सकता है (यह मानता है कि आपके सभी ऐप कंट्रोलर इनहेरिट करते हैं BaseController)
बेलाश

63

वेब की स्टेटलेस प्रकृति के कारण, सत्र भी वस्तुओं को जारी रखने और उन्हें एक सत्र में संग्रहीत करने के अनुरोधों के साथ वस्तुओं को बनाए रखने का एक अत्यंत उपयोगी तरीका है।

इसका एक सही उपयोग मामला हो सकता है यदि आपको अपने आवेदन में नियमित जानकारी तक पहुंचने की आवश्यकता है, प्रत्येक अनुरोध पर अतिरिक्त डेटाबेस कॉल को बचाने के लिए, इस डेटा को एक ऑब्जेक्ट में संग्रहीत किया जा सकता है और प्रत्येक अनुरोध पर अनारक्षित किया जा सकता है, जैसे:

हमारे पुन: प्रयोज्य, क्रमबद्ध वस्तु:

[Serializable]
public class UserProfileSessionData
{
    public int UserId { get; set; }

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

उदाहरण:

public class LoginController : Controller {

    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            var profileData = new UserProfileSessionData {
                UserId = model.UserId,
                EmailAddress = model.EmailAddress,
                FullName = model.FullName
            }

            this.Session["UserProfile"] = profileData;
        }
    }

    public ActionResult LoggedInStatusMessage()
    {
        var profileData = this.Session["UserProfile"] as UserProfileSessionData;

        /* From here you could output profileData.FullName to a view and
        save yourself unnecessary database calls */
    }

}

एक बार जब यह ऑब्जेक्ट सीरियलाइज्ड हो जाता है, तो हम इसे बनाने के लिए या फिर से मौजूद डेटा के लिए डेटाबेस को क्वेरी किए बिना सभी नियंत्रकों में इसका उपयोग कर सकते हैं।

निर्भरता इंजेक्शन का उपयोग करके अपने सत्र वस्तु को इंजेक्ट करें

एक आदर्श दुनिया में आप ' इंटरफेस टू प्रोग्राम, इम्प्लीमेंटेशन नहीं ' और अपनी अनुक्रमिक सत्र ऑब्जेक्ट को अपनी कंट्रोलर पसंद के कंट्रोलर कंटेनर का उपयोग करके अपने कंट्रोलर में इंजेक्ट करते हैं, जैसे कि (यह उदाहरण स्ट्रक्चरापोर का उपयोग करता है क्योंकि यह वह है जिससे मैं सबसे अधिक परिचित हूं। )।

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());   
    }

    public static IUserProfileSessionData GetUserProfileFromSession()
    {
        var session = HttpContext.Current.Session;
        if (session["UserProfile"] != null)
        {
            return session["UserProfile"] as IUserProfileSessionData;
        }

        /* Create new empty session object */
        session["UserProfile"] = new UserProfileSessionData();

        return session["UserProfile"] as IUserProfileSessionData;
    }
}

फिर आप इसे अपनी Global.asax.csफ़ाइल में पंजीकृत करेंगे ।

उन लोगों के लिए जो सत्र वस्तुओं को इंजेक्ट करने से परिचित नहीं हैं, आप यहां विषय के बारे में अधिक गहन ब्लॉग पोस्ट पा सकते हैं ।

खतरे के संकेत के लिए एक शब्द ही काफी है:

यह ध्यान देने योग्य है कि सत्रों को न्यूनतम रखा जाना चाहिए, बड़े सत्र प्रदर्शन मुद्दों का कारण बन सकते हैं।

यह उन्हें (पासवर्ड, आदि) में किसी भी संवेदनशील डेटा को स्टोर नहीं करने की भी सिफारिश की जाती है।


हालांकि आप कक्षा की परिभाषा कहां रखेंगे? मैं अभी भी सब कुछ करने के लिए बहुत नया हूं, लेकिन मैं बस इस बारे में उत्सुक हूं कि अन्य नियंत्रक वर्ग को कैसे देखेंगे और जानेंगे कि यह क्या है। क्या आप इसे नियंत्रक के शीर्ष पर जोड़ते हैं? मैं Global.asax में SessionStart पर सोच रहा था कि मैं चीजों को इनिशियलाइज़ करूँगा लेकिन शायद यह करने का सबसे अच्छा तरीका नहीं है।
शौन ३१४

@ Shaun314 आदर्श रूप से आप अपने नियंत्रक में निर्भरता इंजेक्शन के माध्यम से वस्तु को इंजेक्ट करने के लिए एक IoC कंटेनर का उपयोग करेंगे (संपादित करें देखें)।
जोसेफ वुडवर्ड

1
मैं पहचानकर्ता का उपयोग करके उपयोगकर्ता में लॉग इन करने के बाद कुछ सत्र की जानकारी संग्रहीत कर रहा हूं। मैं पहली कार्रवाई की तुलना में अन्य कार्यों और नियंत्रकों में उन जानकारी को पुनः प्राप्त करने में सक्षम नहीं हूं जिन्हें मैं उपयोगकर्ता को पुनर्निर्देशित करता हूं। कोई उपाय?
अकबरी

17

इस प्रकार से ASP.NET और ASP.NET MVC में सेशन स्टेट काम करता है:

ASP.NET सत्र राज्य अवलोकन

मूल रूप से, आप ऐसा सत्र ऑब्जेक्ट में मान संग्रहीत करने के लिए करते हैं:

Session["FirstName"] = FirstNameTextBox.Text;

मान प्राप्त करने के लिए:

var firstName = Session["FirstName"];

10
जब आप किसी अन्य नियंत्रक से अनुरोध करते हैं तो कोई क्रॉस कंट्रोलर सत्र नहीं होता है, उदाहरण के Accountलिए Home, सत्र ["FirstName"] शून्य है। डेवलपर्स BaseControllerको एक संरक्षित क्षेत्र बनाना और परिभाषित करना है ( internal protected HttpSessionStateBase SharedSessionजो Sessionसभी उप नियंत्रकों में साझा चर को उजागर कर सकता है (यह मानता है कि आपके सभी ऐप नियंत्रक से विरासत में मिले हैं BaseController)
बेलाश

4
उम्म, यकीन है कि वहाँ है? नियंत्रक में एक सत्र चर (MVC द्वारा प्रदान किया गया आधार नियंत्रक) है।
एलीसड

7
@ यह पूरी तरह से गलत है। सत्र नियंत्रकों में उपलब्ध हैं जिन्हें मैंने होमकंट्रोलर में सत्र ["परीक्षण"] निर्धारित किया है, फिर इसे मेरे खाता नियंत्रक में पढ़ें।
नीको

0

आप किसी सत्र में किसी भी तरह के डेटा को स्टोर कर सकते हैं:

Session["VariableName"]=value;

यह चर 20 मिनट या तो पिछले जाएगा।


-8

U सत्र में किसी भी मान को संग्रहीत कर सकता है जैसे सत्र ["FirstName"] = FirstNameTextBox.Text; लेकिन मैं आपको सुझाव दूंगा कि मॉडल असाइन किए गए मूल्य में स्थिर क्षेत्र के रूप में इसे ले लें और आप उस फ़ील्ड मान को किसी भी स्थान पर एक्सेस कर सकते हैं जहां आवेदन किया गया हो। आपको सत्र की आवश्यकता नहीं है सत्र से बचना चाहिए।

public class Employee
{
   public int UserId { get; set; }
   public string EmailAddress { get; set; }
   public static string FullName { get; set; }
}

नियंत्रक पर - Employee.FullName = "ABC"; अब आप इस पूरे नाम को आवेदन में कहीं भी उपयोग कर सकते हैं।


10
स्थैतिक क्षेत्रों पर डेटा संग्रहीत करना, विशेष रूप से उपयोगकर्ता नाम जैसे कर्मचारी डेटा बहु-उपयोगकर्ता वातावरण में गंभीर समस्याएं पैदा करेगा। जब दो अलग-अलग उपयोगकर्ता सिस्टम में लॉग इन करते हैं, तो वे समान Employee.EmailAddress देखेंगे क्योंकि Employee पर स्थिर फ़ील्ड प्रत्येक उदाहरण के लिए समान है।
गोकेर गोकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.