এএসপি.নেট এমভিসি কন্ট্রোলার কনস্ট্রাক্টরগুলিতে সেশনটি শূন্য


89

নিয়ন্ত্রণকারীদের নির্মাতাদের কেন সেশন নাল? এটি অ্যাকশন পদ্ধতি থেকে অ্যাক্সেস করা যায়। সম্ভবত, যেহেতু এমভিসি রাউটিং কাঠামোটি একটি নিয়ামককে নতুন করে তোলার জন্য দায়বদ্ধ, এটি ঠিক এ পর্যায়ে অধিবেশনটি পুনঃপ্রতিষ্ঠিত করে নি।

কেউ কি জানেন যে এটি ডিজাইনের মাধ্যমে এবং যদি তাই হয় তবে কেন?

[আমি একটি অলস লোডিং প্যাটার্ন ব্যবহার করে সমস্যাটি সমাধান করতে পেরেছি]]

উত্তর:


80

আন্দ্রেই ঠিক বলেছেন - এটি শূন্য কারণ এএসপি.নেট এমভিসি ফ্রেমওয়ার্কের অধীনে চলাকালীন, যখন আপনি আশা করতে পারেন নিয়ামক শ্রেণি নির্ধারণ করা হয় তখন HTTPContext (এবং তাই এইচটিটিপি কনটেক্সট।সেশন) সেট করা থাকে না, তবে এটি পরে ("ইনজেকশন") সেট করে কন্ট্রোলার বিল্ডার ক্লাস দ্বারা। আপনি যদি জীবনচক্রের আরও ভাল ধারণা বুঝতে চান তবে আপনি এএসপি.নেট এমভিসি ফ্রেমওয়ার্কটি (উত্স উপলভ্য) নীচে নামাতে পারেন, বা এই পৃষ্ঠাটি দেখুন:

আপনার যদি সেশনটি অ্যাক্সেসের প্রয়োজন হয় তবে একটি উপায় হ'ল "অন্যাকশনএক্সেকটিং" পদ্ধতিটি ওভাররাইড করা এবং সেখানে অ্যাক্সেস করা, কারণ এটি ততক্ষণে উপলভ্য হবে।

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


4
আমি নিশ্চিত না যে এটি এইচটিপিপেক্সটেক্সট সম্পর্কে সঠিক বক্তব্য। এটি আসলে পুরো প্রবাহের শুরুতে তৈরি হয়েছিল। বিস্তারিত প্রবাহ সম্পর্কে একটু এখানে পড়তে পারবেন beletsky.net/2011/06/inside-aspnet-mvc-route-to-mvchanlder.html অথবা আপনি প্রতিফলক ব্যবহার এবং নিজেকে খুঁজে যখন httpContext instantiated হয়েছে পারে - httpruntime তার চারপাশের লাইন 1556 .cs।
অ্যালেক্সি শ্যাচারবাক

@ আলেকিশ্যাচারবাক এটি ইতিমধ্যে নির্মিত হতে পারে - এমপিসি নিয়ন্ত্রণকারীর সেশন সম্পত্তিতে এটি সেট করা হয়েছে কিনা সে সম্পর্কে ওপি is অর্থ্যাৎ পাবলিক এইচটিটিপিএসশন স্টেটবেস সেশন {পেতে; । System.Web.Mvc.Controller এ এগুলি বিভিন্ন জিনিস।
মেমডেভোপার

62

এখানে অন্যান্য উত্তরগুলি ছাড়াও, যদিও Controller.Sessionকনস্ট্রাক্টরে জনবহুল না থাকলেও আপনি এখনও সেশনটি অ্যাক্সেস করতে পারবেন:

System.Web.HttpContext.Current.Session

মানক সতর্কতার সাথে যা এটি আপনার নিয়ামকের পরীক্ষার সম্ভাব্যতা হ্রাস করে।


4
এই দুটি সেশনের বৈশিষ্ট্যের জন্য পৃথক পৃথক, যা আপনি সেশন স্টেটের নিজেই কোনও রেফারেন্স রাখার তাগিদ দিচ্ছেন তা বিবেচনা করতে পারে।
ব্রায়ানকুকি

@ ব্রায়ান কুকসি কি আলাদা?
মাইকেলমাও

4
Controller.Session টাইপ System.Web.HttpSessionStateBase হয় (দেখুন msdn.microsoft.com/en-us/library/... ) কিন্তু System.Web.HttpContext.Current.Session (দেখুন টাইপ System.Web.SessionState.HttpSessionState হয় MSDN .microsoft.com / এন-ইউএস / লাইব্রেরি /… )
ব্রায়ানকুকি

পুরানো উত্তর, তবে এটি বলতে চেয়েছিলেন যে System.Web.HttpContext.Current.Sessionএটি nullVS2019 এমভিসি ইনস্ট্যান্টিয়েটারেও রয়েছে।
jp2code

আপনি এইচটিটিপিএসশনস্টেট স্ট্র্যাপের কনস্ট্রাক্টরটি ব্যবহার করে একটি এইচটিটিপিএসশনস্টেট থেকে এটি গুটিয়ে রাখতে পারেন p
ফ্যাব্রিকিও

11

অধিবেশনটি পরে জীবন-চক্রটিতে ইনজেকশনের ব্যবস্থা করা হয়। কেন আপনার কনস্ট্রাক্টরে সেশনটি দরকার? টিডিডি-র জন্য আপনার যদি এটির প্রয়োজন হয় তবে আপনার সেশনটি মকোকেবল অবজেক্টে মোড়ানো উচিত।


4
আন্দ্রে রাইনাকে যুক্ত করতে, এটি তাঁর দ্বারা উল্লিখিত কৌশলটির একটি নির্দিষ্ট উদাহরণ: iridescence.no/post/…
মুরকি

4
আমি আমার নির্মাতাদের সময় সেশনটি অ্যাক্সেস করতে চাই যাতে আমার আগের সঞ্চিত সেশন তথ্যটিতে অ্যাক্সেস থাকতে পারে। হ্যাঁ, আমি অন্যাকশনএক্সেকুটিং পদ্ধতিটি ওভাররাইড করতে পারি, তবে এটি অবশ্যই একটি মার্জিত সমাধান নয়।
ক্রিস আর্নল্ড

8

আপনার সেশনটি সেট করতে আপনি ইনিশিয়াল পদ্ধতিটি ওভাররাইড করতে পারেন।

protected override void Initialize(RequestContext requestContext)

2

আপনি যদি কোনও আইওসি পাত্রে ব্যবহার করছেন HttpSessionStateBaseতবে Sessionঅবজেক্টের পরিবর্তে ইনজেকশন এবং ব্যবহার করে দেখুন :

private static Container defaultContainer()
{
    return new Container(ioc =>
    {
        // session manager setup
        ioc.For<HttpSessionStateBase>()
           .Use(ctx => new HttpSessionStateWrapper(HttpContext.Current.Session)); 
    });
}

2

এই উত্তরটি কিছু লোকের পক্ষে কার্যকর হতে পারে

আমরা যদি ইনিশিয়াল পদ্ধতিটি ওভাররাইড করি তবে আমাদের অনুরোধের প্রসঙ্গে বেস ক্লাসটি শুরু করতে হবে: বেস.ইনিটালাইজ (অনুরোধকন্টেক্সট);

protected override void Initialize(RequestContext requestContext)
        {
            base.Initialize(requestContext);
           

        }

উপকারী নোট করুন পদ্ধতি স্বাক্ষর protected override void Initialize(System.Web.Routing.RequestContext requestContext)
মার্টিন_ডব্লিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.