বর্তমান এএসপি.এনইটি অধিবেশন শূন্য হলে আমার কী করা উচিত?


125

আমার ওয়েব অ্যাপ্লিকেশনটিতে, আমি সেশন ভেরিয়েবলগুলি পড়ার জন্য এরকম কিছু করি:

if (HttpContext.Current.Session != null &&  HttpContext.Current.Session["MyVariable"] != null)
{
    string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}

আমি বুঝতে পেরেছি কেন এইচটিটিপি কনটেক্সট.কন্টেনার.সেশন ["মাই ভ্যারিয়েবল"] নাল (কেন এই ভেরিয়েবলটি সেশনে এখনও সংরক্ষণ করা হয়নি বা বিভিন্ন কারণে সেশনটি পুনরায় সেট করা হয়েছে) তবে কেন আমাকে পরীক্ষা করতে হবে? যদি HttpContext.Current.Sessionনাল হয়?

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

if (HttpContext.Current.Session != null)
{
    HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
    // What should be done in this case (if session is null)?
    // Is it possible to force the session to be created if it doesn't exist?
}

এএসপি.নেট ওয়েবএপি'র বিবিধ আচরণ থাকবে, আপনি
এএসপি.নেট

উত্তর:


158

হ্যাঁ, সেশন অবজেক্টটি শূন্য হতে পারে, তবে কেবলমাত্র কিছু নির্দিষ্ট পরিস্থিতিতে, যা আপনি খুব কমই চালিত করবেন:

আপনার যদি কেবল পৃষ্ঠাগুলিতে কোড থাকে তবে আপনি এতে প্রবেশ করবেন না। আমার বেশিরভাগ এএসপি। নেট কোড বারবার শূন্যতার জন্য পরীক্ষা না করে সেশন ব্যবহার করে। যাইহোক, আপনি যদি আইএইচটিপিডমডুল বিকাশ করছেন বা অন্যথায় এএসপি। নেট এর গুরুতর বিবরণে নামা করছেন তবে এটি চিন্তা করার মতো কিছু।

সম্পাদন করা

মন্তব্যের উত্তরে: সেশন রাষ্ট্রটি পাওয়া যায় কি না তার উপর নির্ভর করে একুয়ারআরেক্সেস্টস্টেট ইভেন্টটি অনুরোধটির জন্য চালিত হয়েছে কিনা। এখানেই সেশন রাষ্ট্র মডিউলটি সেশন কুকি পড়ে এবং আপনার জন্য সেশন ভেরিয়েবলের অ্যাপোপিয়েট সেট সন্ধান করে এটির কাজ করে।

আপনার পৃষ্ঠায় নিয়ন্ত্রণ হস্তান্তরিত হওয়ার আগে অ্যাকুয়ারআরয়েস্টেস্টেট চলে। সুতরাং আপনি যদি নিজের পৃষ্ঠা থেকে স্থির শ্রেণি সহ অন্যান্য কার্যকারিতা কল করছেন, আপনার ভাল হওয়া উচিত।

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

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


6
আমি আজ একটি দ্রুত আপডেট পেয়েছি। পৃষ্ঠা নির্মাতায় সেশন পাওয়া যায় না! কেবল ইনস ইভেন্টে বা তার পরে।
নুনো আগাপিতো

আমি সবেমাত্র একটি এইচটিপিপন্টেক্সটেক্সট.কন্টেনার.সেশন == নালকে একটি মাস্টার পৃষ্ঠার পেজ_ল্ড ইভেন্ট দ্বারা কল করা কোড বলে। স্পষ্টতই, এটি কোনও পৃষ্ঠার প্রসঙ্গে হতে পারে। যদি আমি এইচটিটিপি কনটেক্সট.কন্টেন্যান্ট অবজেক্টটি পরিদর্শন করি তবে এর বেশিরভাগ সদস্যই প্রাথমিক অবস্থায় থাকলেও কারেন্টনোটিকেশন এবং ইসপোস্টনোটিকেশন একটি ত্রুটি ফেলে:। সিস্টেম.প্ল্যাটফর্ম নটসপোর্টড এক্সেক্সশন}} কারণ যাই হোক না কেন, এই সমস্যাটি উত্পাদন ক্ষেত্রে দেখা যায় নি, যেখানে এটি বছরের পর বছর চলে। প্ল্যাটফর্মটি উইন্ডোজ সার্ভার 2003 আর 2 এসপি 2, অ্যাপ্লিকেশনটির লক্ষ্য ফ্রেমওয়ার্ক রয়েছে। নেট 3.5 এবং আইআইএসে সেশন স্টেট সক্ষম করে চালিত হয়।
আর শেরুর্স

আমি এটিও খুঁজে পেয়েছি যে, যখন আইআইএস ডিস্কে উপস্থিত কোনও রিসোর্স ফাইলের জন্য সরাসরি অনুরোধটি সরবরাহ করে, যেমন স্টাইল শিট, HttpContext.Current.Session`অ্যাপ্লিকেশন_একুইয়াররেউস্টেস্টে কোড নষ্ট হতে পারে। পৃষ্ঠাটির জন্য অনুরোধটি অবশ্য সেশনের অবজেক্টটিকে কোডের জন্য উপলব্ধ করে। এটি অন্তত MVC.NET 4 এর অধীনে।
ingredient_15939

আমি মনে করি আপনি যদি আউটপুট-ক্যাশেড এমভিসি ক্রিয়াকলাপের ভিতরে থাকেন তবে এটি নালও হতে পারে।
ব্যবহারকারী 2173353

40

নিম্নলিখিত বিবৃতি সম্পূর্ণ সঠিক নয়:

"সুতরাং আপনি যদি নিজের পৃষ্ঠা থেকে স্ট্যাটিক ক্লাস সহ অন্যান্য কার্যকারিতা কল করছেন, আপনার ভাল হওয়া উচিত"

আমি একটি স্থির পদ্ধতি কল করছি যা এইচটিটিপি কনটেক্সট.কন্টেনার.সেশনের মাধ্যমে অধিবেশনটির উল্লেখ করে এবং এটি বাতিল হয় ull যাইহোক, আমি jQuery ব্যবহার করে এজাক্সের মাধ্যমে একটি ওয়েবসার্চ পদ্ধতির মাধ্যমে পদ্ধতিটি কল করছি।

আমি এখানে যেমন জানতে পেরেছি আপনি পদ্ধতিটিতে একটি সাধারণ বৈশিষ্ট্য সহ সমস্যাটি সমাধান করতে পারেন, বা ওয়েব পরিষেবা সেশন অবজেক্টটি ব্যবহার করতে পারেন:

যদিও একটি কৌশল আছে একটি ওয়েব পদ্ধতিতে সেশন স্থিতি অ্যাক্সেস করার জন্য, আপনাকে অবশ্যই সেশন স্টেট ম্যানেজমেন্টটি সক্ষম করতে হবে:

[ওয়েবমেথড (সক্ষমসেশন = সত্য)]

সক্ষমসেশন মান উল্লেখ করে, আপনি এখন খেলতে একটি পরিচালিত সেশন পাবেন। আপনি যদি এই মানটি নির্দিষ্ট না করে থাকেন তবে আপনি একটি নাল সেশন অবজেক্ট পাবেন এবং সেশন অবজেক্টে অ্যাক্সেস করার চেষ্টা করার পরে শূন্য রেফারেন্স ব্যতিক্রমগুলির মধ্যে আরও বেশি কিছু ঘটবে।

সমাধানের জন্য ম্যাথিউ কোজিয়ারকে ধন্যবাদ।

ভেবেছিলাম আমি আমার দুটি সেন্ট যুক্ত করব।

এড


1
থ্যাঙ্কস এড, সেশনটি ওয়েবম্যাথোডে নাল হিসাবে উপস্থিত হচ্ছিল - এটি এটিকে সংশোধন করে। +1
ফুসি

1
ঠিক আছে, আপনি যখন কোনও ওয়েবসার্ভিসে কল করছেন, আপনি পৃষ্ঠার চেয়ে অন্য একটি অনুরোধ ব্যবহার করবেন, সুতরাং সেই বিবৃতিটি এখনও সঠিক, আইএমও।
ড্রিস করুন

এমএসডিএন ডক্স এখানে - the default value is false। একটি যাদুমন্ত্র মত কাজ করে.
বেনজিনার

22

যদি আপনার সেশন উদাহরণটি শূন্য হয় এবং আপনার একটি 'অ্যাশএক্স' ফাইলে থাকে তবে কেবল 'আইআরকিয়ারসেশনসেট স্টেট' ইন্টারফেস প্রয়োগ করুন।

এই ইন্টারফেসটির কোনও সদস্য নেই তাই আপনার কেবল শ্রেণিবিন্যাসের পরে ইন্টারফেসের নাম যুক্ত করতে হবে (সি #):

public class MyAshxClass : IHttpHandler, IRequiresSessionState

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

আমি মনে করি এটি উত্তরটি বেশ ভাল উত্তর দেয়। অনেক ধন্যবাদ.
শচীন জোসেফ

2

ASP.NET প্রযুক্তিগত নিবন্ধ

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

সম্পাদনা করুন:

অধিবেশন: নতুনদের জন্য একটি ধারণা

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


2

আমার ক্ষেত্রে ASP.NET State Serviceবন্ধ ছিল। পরিবর্তন Startup typeকরার জন্য Automaticএবং প্রথম বারের জন্য ম্যানুয়ালি সেবা শুরু ইস্যু সমাধান।

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