একটি এএসপি.নেট এমভিসি 4 অ্যাপ্লিকেশনটিতে সেশনগুলি কীভাবে ব্যবহার করবেন?


113

আমি এএসপি.এনইটি এমভিসিতে নতুন। আমি আগে পিএইচপি ব্যবহার করেছি এবং একটি সেশন তৈরি করা এবং বর্তমান সেশন ভেরিয়েবলের উপর ভিত্তি করে ব্যবহারকারীর রেকর্ড নির্বাচন করা সহজ ছিল।

আমি একটি সাধারণ ধাপে ধাপে টিউটোরিয়ালটির জন্য ইন্টারনেটে সর্বত্র নজর রেখেছি যা আমার সি # এএসপি.নেট এমভিসি 4 অ্যাপ্লিকেশনটিতে কীভাবে সেশন তৈরি করতে এবং ব্যবহার করতে হবে তা আমাকে প্রদর্শন করতে পারে। আমি ব্যবহারকারীর ভেরিয়েবলগুলির সাথে একটি সেশন তৈরি করতে চাই যা আমি আমার কন্ট্রোলারগুলির যে কোনও জায়গা থেকে অ্যাক্সেস করতে পারি এবং আমার লিনকিউ কোয়েরিতে ভেরিয়েবলগুলি ব্যবহার করতে সক্ষম হতে পারি।



2
এই নিবন্ধটি আগ্রহী হতে পারে: brockallen.com/2012/04/07/think-twice-about- using
ড্যানিয়েল

উত্তর:


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
আপনি কোনও সেশনে যেকোন প্রকারের যেকোনও ডেটা সঞ্চয় করতে পারেন। একবার তৈরি হয়ে গেলে আপনি সমস্ত দর্শন এবং নিয়ামক জুড়ে এতে সঞ্চিত মানটি অ্যাক্সেস করতে পারেন। আরও খেয়াল করুন যে তৈরি হওয়া সেশনটি কেবলমাত্র প্রতি ব্যবহারকারী এবং প্রতি ব্রাউজারে অ্যাক্সেসযোগ্য। মানে ফায়ারফক্স ব্যবহার করে ইউজার 1 দ্বারা তৈরি সেশনটি একই ব্যবহারকারী আইই ব্যবহার করে অ্যাক্সেস করতে পারবেন না। এমন কিছু বিষয় রয়েছে যা আপনার যেমন সেশন দিয়ে করা উচিত নয়। এটিতে বড় ডেটা সঞ্চয় করবেন না। এটি আপনার সার্ভারের কার্যকারিতা ধীর করতে পারে। শেষ
অবধি

2
আবারও ধন্যবাদ! আমি এটিকে বিভিন্ন নিয়ামক জুড়ে অ্যাক্সেস করতে সক্ষম করার জন্য কোথায় তৈরি করব?
থুটো পল গাওটিংওয়ে

2
@ জোবার্টএমন্নো যে মানটি থেকে আসে তা সংরক্ষণ করা নিরাপদ WebSecurity.CurrentUserIdতাই এটি ডাটাবেস থেকে একাধিকবার টানা না (আমি দেখতে পেলাম যে এটি খুব ব্যয়বহুল)?
Andrius Naru Narevičius

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ফাইলে নিবন্ধভুক্ত করবেন ।

ইনজেকশন সেশন অবজেক্টগুলির সাথে যারা পরিচিত নয় তাদের জন্য, আপনি এখানে বিষয় সম্পর্কে আরও গভীরতর ব্লগ পোস্ট পেতে পারেন ।

সতর্কতার শব্দ:

এটি লক্ষণীয় যে সেশনগুলি সর্বনিম্ন রাখা উচিত, বড় সেশনগুলি পারফরম্যান্স সমস্যার কারণ হতে শুরু করে।

এটিতে কোনও সংবেদনশীল ডেটা (পাসওয়ার্ড ইত্যাদি) সংরক্ষণ না করার পরামর্শ দেওয়া হয়।


ক্লাস সংজ্ঞা আপনি কোথায় রাখবেন? আমি এখনও সবকিছুতে বেশ নতুন, তবে অন্যান্য কন্ট্রোলাররা ক্লাসটি কীভাবে দেখবে এবং এটি কী তা জানতে পারে সে সম্পর্কে আমি কেবল কৌতূহলী। আপনি কি কেবল এটি নিয়ামকের শীর্ষে যুক্ত করেছেন? আমি গ্লোবাল.অ্যাসেক্সে সেশনস্টার্ট নিয়ে ভাবছিলাম আমি জিনিসগুলি সূচনা করব তবে এটি করার সর্বোত্তম উপায় এটি নয়।
শান 314

@ শন ৩১৪ আদর্শভাবে আপনি নির্ভরতা ইনজেকশন (সম্পাদনা দেখুন) এর মাধ্যমে আপনার নিয়ামকটিতে অবজেক্টটি ইনজেক্ট করার জন্য একটি আইওসি পাত্রে ব্যবহার করবেন।
জোসেফ উডওয়ার্ড

1
আইডেন্টিটি ২ ব্যবহার করে লগ ইন করার পরে আমি কিছু সেশন তথ্য সংরক্ষণ করছি আমি যে ক্রিয়াকলাপটি ব্যবহারকারীকে পুনঃনির্দেশিত করেছি তার চেয়ে অন্য ক্রিয়াকলাপ এবং নিয়ামকগুলিতে আমি সেই তথ্যগুলি পুনরুদ্ধার করতে পারছি না। কোন ধারণা?
আকবরী

17

এএসপি.এনইটি এবং এএসপি.নেট এমভিসিতে সেশন স্টেটটি এভাবে কাজ করে:

এএসপি.এনইটি সেশন স্টেট ওভারভিউ

মূলত, আপনি সেশন অবজেক্টে একটি মান সংরক্ষণ করার জন্য এটি করেন:

Session["FirstName"] = FirstNameTextBox.Text;

মানটি পুনরুদ্ধার করতে:

var firstName = Session["FirstName"];

10
সেখানে যখন আপনার কাছ থেকে উদাহরণস্বরূপ অন্য নিয়ামক অনুরোধ, তাই কোনও ক্রস নিয়ামক অধিবেশনে যোগ দিচ্ছে Accountকরতে Home, সেশন [ "Firstname"] নাল হয়। বিকাশকারীদের BaseControllerএকটি সুরক্ষিত ক্ষেত্র তৈরি করতে হবে এবং এটি সংজ্ঞায়িত internal protected HttpSessionStateBase SharedSessionকরতে হবে ( ) যা Sessionসমস্ত উপ-নিয়ন্ত্রকদের মধ্যে ভাগ করা পরিবর্তনশীল (এটি ধরে নেওয়া যায় যে আপনার সমস্ত অ্যাপ্লিকেশন কন্ট্রোলাররা উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে BaseController)
বেলাশ

4
উম্ম, নিশ্চয়ই আছে? কন্ট্রোলারে একটি সেশন ভেরিয়েবল রয়েছে (এমভিসি দ্বারা সরবরাহিত বেস কন্ট্রোলার)।
aeliusd

7
@ বেলাশ এটি সম্পূর্ণরূপে ভুল। সেশনগুলি নিয়ন্ত্রণকারীদের জুড়ে উপলভ্য হয় আমি সবেমাত্র হোমকন্ট্রোলারে সেশন ["পরীক্ষা"] সেট করেছিলাম তা পরে এটি আমার অ্যাকাউন্টকন্ট্রোলারে পড়ে।
নিকো

0

আপনি একটি সেশনে যেকোন ধরণের ডেটা সঞ্চয় করে রাখতে পারেন:

Session["VariableName"]=value;

এই পরিবর্তনশীলটি 20 মিনিট বা তার বেশি সময় ধরে চলবে।


-8

সেশনে ["ফার্স্টনাম"] = ফার্স্টনেমটেক্সটবক্স.টেক্সট এর মতো আপনি কোনও মান সংরক্ষণ করতে পারেন; তবে আমি আপনাকে এটির জন্য নির্ধারিত মডেলটির স্থির ক্ষেত্র হিসাবে গ্রহণ করার পরামর্শ দিচ্ছি এবং আপনি যে ক্ষেত্রের মান প্রয়োগ করতে পারেন সেখানে যে কোনও স্থানে প্রবেশ করতে পারবেন। আপনার সেশনের দরকার নেই। অধিবেশন এড়ানো উচিত।

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

নিয়ন্ত্রণকারী - কর্মচারী.ফুলনাম = "এবিসি"; এখন আপনি প্রয়োগের যে কোনও জায়গায় এই পুরো নামটি অ্যাক্সেস করতে পারবেন।


10
স্ট্যাটিক ক্ষেত্রগুলিতে ডেটা সঞ্চয় করা, বিশেষত কর্মচারীর নামের মতো ব্যবহারকারীর ডেটা মাল্টি-ইউজার পরিবেশে মারাত্মক সমস্যা সৃষ্টি করবে। যখন দুটি ভিন্ন ব্যবহারকারী সিস্টেমে লগইন করেন, তারা একই কর্মচারী দেখতে পাবেন Emplo ইমেল অ্যাড্রেস থেকে প্রতিটি উদাহরণের জন্য কর্মচারীর স্থির ক্ষেত্র একই।
Gçkçer Gökdal
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.