এএসপি.এনইটি-এর কোনও শ্রেণি থেকে সেশন ভেরিয়েবল কীভাবে অ্যাক্সেস করবেন?


157

আমি আমার অ্যাপ্লিকেশনটির অ্যাপ_কোড ফোল্ডারে একটি ক্লাস ফাইল তৈরি করেছি। আমার একটি সেশন ভেরিয়েবল আছে

Session["loginId"]

আমি আমার ক্লাসে এই সেশন ভেরিয়েবলগুলি অ্যাক্সেস করতে চাই, তবে যখন আমি নীচের লাইনটি লিখছি তখন এটি ত্রুটি দেয়

Session["loginId"]

যে কেউ আমাকে কীভাবে বলতে পারবেন কীভাবে একটি ক্লাসের মধ্যে সেশন ভেরিয়েবল অ্যাক্সেস করবেন যা এএসপি.নেট ২.০ (সি #) এ অ্যাপ_কোড ফোল্ডারে তৈরি করা হয়েছে

উত্তর:


363

(সম্পূর্ণতার জন্য আপডেট করা)
আপনি ব্যবহার করে যে কোনও পৃষ্ঠা থেকে বা যে Session["loginId"]কোনও শ্রেণি থেকে (যেমন শ্রেণীর পাঠাগারের ভিতরে থেকে) সেশন ভেরিয়েবলগুলি অ্যাক্সেস করতে পারেন usingSystem.Web.HttpContext.Current.Session["loginId"].

তবে দয়া করে আমার আসল উত্তরের জন্য পড়ুন ...


সেশন ভেরিয়েবলগুলিতে অ্যাক্সেসকে সহজ করার জন্য আমি সবসময় এএসপি.এনইটি সেশনের চারপাশে একটি মোড়কের ক্লাস ব্যবহার করি:

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; }
}

এই ক্লাসটি এএসপি.এনইটি সেশনে নিজের একটি উদাহরণ সংরক্ষণ করে এবং আপনাকে কোনও শ্রেণি থেকে টাইপ-নিরাপদ উপায়ে আপনার সেশন বৈশিষ্ট্যগুলি অ্যাক্সেস করতে দেয়, যেমন:

int loginId = MySession.Current.LoginId;

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

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

এই পদ্ধতির বিভিন্ন সুবিধা রয়েছে:

  • এটি আপনাকে প্রচুর টাইপ-কাস্টিং থেকে বাঁচায়
  • আপনার অ্যাপ্লিকেশন জুড়ে আপনাকে হার্ড-কোডেড সেশন কী ব্যবহার করতে হবে না (যেমন সেশন ["লগইনআইডি"]
  • আপনি মাই সেশনের বৈশিষ্ট্যগুলিতে এক্সএমএল ডক মন্তব্য যুক্ত করে আপনার সেশন আইটেমগুলি নথিভুক্ত করতে পারেন
  • আপনি ডিফল্ট মানগুলির সাথে আপনার সেশন ভেরিয়েবলগুলি সূচনা করতে পারেন (উদাহরণস্বরূপ যে তারা নাল নয় তা নিশ্চিত করে)

6
কোনও কোড লেখার দরকার নেই, উত্তরে বর্ণিত হিসাবে ব্যবহার করুন। যেমন "পাবলিক ইন্ট লগইনইড I পেতে; সেট;}" -> এটিকে একটি স্বয়ংক্রিয় সম্পত্তি বলা হয় called
এম

4
আপনি যদি নেট .x 3.x ব্যবহার করে থাকেন তবে আমার কোড অনুসারে আপনি স্বয়ংক্রিয় বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন। .Net 2.x / 1.x এর সাহায্যে এটি উপলভ্য নয় এবং আপনাকে নিজের সম্পত্তিগুলির গেটর / সেটার নিজেই প্রয়োগ করতে হবে: প্রাইভেট ইন _ লগিনআইডি; পাবলিক ইন্টে লগইন করুন {get {ফেরত _ লগিনআইডি; } সেট {_ লগইনআইডি = মান; }}
M4N

2
দেখতে এখন দুর্দান্ত লাগছে, আমি মনে করি আমি আমার সমস্যার উত্তর পেয়েছি এবং আমি আপনার উপায়টি ব্যবহার করছি, এটি খুব পরিষ্কার এবং আমার সমস্ত সেশন ভেরিয়েবলগুলি এক জায়গায় বজায় রাখা সহজ। ধন্যবাদ @ মার্টিন, আপনি দুর্দান্ত।
প্রশান্ত

23
@ এম 4 এন, আশা করি আমি +1 এর চেয়ে কিছুটা কৃতজ্ঞতা প্রকাশ করতে পারতাম। আমার প্রকল্পগুলিতে সেশন / ক্যাশে নিয়ে কাজ করার এটি আমার প্রিয় উপায় হয়ে উঠেছে। আমার কোড, আক্ষরিকভাবে আপনাকে ধন্যবাদ জানায়।
ব্র্যান্ডন বুন

4
@ ক্রিস্টোফার যখন 'কারেন্ট' সম্পত্তি স্থির থাকে তখন মাই সেশন ফেরত দেওয়া উদাহরণ নয় ... সুতরাং এটি ঠিক আছে। স্থিতিশীল পদ্ধতি এবং বৈশিষ্ট্য এইভাবে ব্যবহার করা নিরাপদ।
ড্যারেন

104

এইচটিটিপি কনটেক্সট: থ্রেডের মাধ্যমে অধিবেশন অ্যাক্সেস করুন

HttpContext.Current.Session["loginId"]

এই সহজ পদক্ষেপের জন্য একটি টন অ্যান্টনিকে ধন্যবাদ।
কিংস

অ্যান্টনি অনেক ধন্যবাদ, এর জন্য +1
ওয়াইস কুরেশি

ধন্যবাদ। নামস্থানটি কী ছিল তা ভুলে
অ্যান্টনি হর্নি

@ অ্যান্টনিডব্লু জোনস আমি আপনার পদ্ধতিটি ব্যবহার করেছি, তবে সমস্যা আছে, আপনি কি আমাকে ব্যাখ্যা করতে পারবেন, আমি কোথায় ভুল বা ব্যবহারের সঠিক উপায় কী, আমার প্রশ্ন স্ট্যাকওভারফ্লো
আদনান

এবং যদি আপনি এইচটিটিপিএসশন স্টেটবেসে রূপান্তর করতে চান: এইচটিটিপিএসশন স্টেটবেস সেশন = নতুন এইচটিটিপিএসশনস্টেট স্ট্র্যাপরেপ (এইচটিটিপি কনটেক্সট.কন্টার.সেশন); Re: stackoverflow.com/questions/5447611/...
sobelito

24

প্রস্তাবিত সমাধানটির সমস্যাটি হ'ল যদি আপনি কোনও প্রক্রিয়া ছাড়াই সেশন স্টোরেজ ব্যবহার করেন তবে এটি সেশনস্টেটে নির্মিত কিছু কার্যকারিতা বৈশিষ্ট্যগুলি ভেঙে ফেলতে পারে। (হয় "স্টেট সার্ভার মোড" বা "এসকিউএল সার্ভার মোড")। ওপ মোডগুলিতে সেশন ডেটাটি পৃষ্ঠা অনুরোধের শেষে সিরিয়ালীকৃত করা উচিত এবং পৃষ্ঠা অনুরোধের শুরুতে deserialized করা দরকার, যা ব্যয়বহুল হতে পারে। কর্মক্ষমতা উন্নত করার জন্য সেশনস্টেট প্রথমবার অ্যাক্সেস করা হলে কেবলমাত্র ভেরিয়েবলকে ডিসরিয়ালাইজ করার মাধ্যমে যা প্রয়োজন তা কেবল ডিসরিয়ালাইজ করার চেষ্টা করে এবং এটি কেবল পরিবর্তন করে পরিবর্তিত পরিবর্তনশীলকে পুনরায় সিরিয়ালাইজ করে এবং প্রতিস্থাপন করে। আপনার যদি সেশন ভেরিয়েবল প্রচুর পরিমাণে থাকে এবং সেগুলি সমস্ত এক শ্রেণিতে প্রবাহিত করে থাকেন তবে আপনার অধিবেশনটির প্রতিটি পৃষ্ঠার অনুরোধে অধিবেশনটি ব্যবহার করা হবে যা সেশন ব্যবহার করে এবং কেবল 1 টি সম্পত্তি পরিবর্তিত হলেও শ্রেণি পরিবর্তিত হওয়া সত্ত্বেও সবকিছু আবার সিরিয়াল করা দরকার। আপনি খুব বেশি সেশন এবং একটি ওওপ মোড ব্যবহার করছেন কিনা তা বিবেচনা করার জন্য কিছু।


4
এটি উজ্জ্বল করার জন্য +1। আপনি যদি সেশনের জন্য ইনপ্রোক ব্যবহার না করে থাকেন তবে আর্নি 100% সঠিক is ইনপ্রোক যাইহোক, খুব সীমিত, কারণ এটি ওয়েবফার্মগুলিকে সমর্থন করে না এবং অ্যাপ্লিকেশনটি আবার শুরু করা হলে হারিয়ে যাবে। দ্রষ্টব্য, কার্য সম্পাদনের জন্য আমরা স্টেট সার্ভার মোড ব্যবহার করে একটি 20% প্রিমিয়াম খুঁজছি এবং এর উপরে সিরিয়ালাইজেশন ব্যয় যুক্ত করা হয়েছে। আপনি যেমন কল্পনা করতে পারেন এটি ব্যয়বহুল হতে পারে। আপনি আদিম প্রকারের (যেমন ইন্ট, স্ট্রিং, চর, বাইট ইত্যাদি) আটকে গিয়ে সিরিয়ালাইজেশন ওভারহেডের কিছু এড়াতে পারেন। কাস্টম অবজেক্ট সিরিয়ালাইজেশনের মুখোমুখি হবে। ব্যবহারকারী সাবধান।
জ্যাক জান্নসেন

+1 ভাল পয়েন্ট। একটি পরিবর্তন যা দুটি ধারণাকে বিয়ে করবে তা হ'ল এই কাস্টম "সেশন" শ্রেণীর প্রতিটি সম্পত্তি সেশনে একটি বড় অবজেক্টের পরিবর্তে এসপ নেট সেশনটি কল করবে। @ এম 4 এন এর দৃষ্টিভঙ্গি এড়ানো যায় এমন ধরণের কাস্টিংটি করতে হবে তবে আপনি প্রতিবার সেশনের কিছু অংশ পড়লে তা উপকারী হতে পারে।
ইওল

12

আমার আগে উপস্থাপিত উত্তরগুলি সমস্যার যথাযথ সমাধান সরবরাহ করে, তবে আমি মনে করি যে এই ত্রুটিটির ফলাফল কেন তা বোঝা গুরুত্বপূর্ণ:

রিটারেটের Sessionসম্পত্তি সেই নির্দিষ্ট অনুরোধের Pageসাথে সম্পর্কিত টাইপের একটি উদাহরণ দেয় HttpSessionStatePage.Sessionআসলে কল করার সমতুল্য Page.Context.Session

এমএসডিএন ব্যাখ্যা করে যে এটি কীভাবে সম্ভব:

কারণ এএসপি.এনইটি পৃষ্ঠাগুলিতে সিস্টেমে একটি ডিফল্ট রেফারেন্স রয়েছে e ওয়েব নামস্থান (যা HttpContextশ্রেণিটি অন্তর্ভুক্ত), আপনি HttpContextসম্পূর্ণরূপে যোগ্য শ্রেণীর রেফারেন্স ছাড়াই একটি .aspx পৃষ্ঠায় সদস্যদের রেফারেন্স করতে পারেন HttpContext

তবে, আপনি যখন অ্যাপ_কোডের কোনও শ্রেণীর মধ্যে এই সম্পত্তিটি অ্যাক্সেস করার চেষ্টা করবেন তখন আপনার শ্রেণি পৃষ্ঠা শ্রেণি থেকে প্রাপ্ত না হওয়া পর্যন্ত সম্পত্তিটি আপনার কাছে পাবেন না।

এই অতি-মুখোমুখি দৃশ্যের জন্য আমার সমাধান হ'ল আমি পৃষ্ঠার বিষয়গুলি কখনই ক্লাসে পাস করি না । আমি বরং সেশন পৃষ্ঠা থেকে প্রয়োজনীয় জিনিসগুলি বের করতে এবং কেসের উপর নির্ভর করে নাম-মান সংগ্রহ / অ্যারে / তালিকা আকারে শ্রেণিতে পাঠিয়ে দেব।


এটি দুর্দান্ত ব্যাখ্যা, এটির জন্য এটি আমাকে +1 সহায়তা করেছিল :)
ওয়েস কুরেশি

1

আমার একই ত্রুটি ছিল, কারণ আমি একটি কাস্টম সেশন ক্লাসের মধ্যে সেশন ভেরিয়েবলগুলি চালিত করার চেষ্টা করছিলাম।

আমাকে বর্তমান প্রসঙ্গে (system.web.httpcontext.c موجودہ) ক্লাসে পাস করতে হয়েছিল এবং তারপরে সবকিছু ঠিকঠাক কাজ করেছিল।

এম এ


1

এসপ নেট কোরটিতে এটি আলাদাভাবে কাজ করে:

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-sessions-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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.