আমি কেবল আবিষ্কার করেছি যে সমস্ত এএসপি. নেট ওয়েবসাইটগুলি ধীর, এবং এটি সম্পর্কে কী করা উচিত তা নিয়ে চেষ্টা করার চেষ্টা করছি


275

আমি সবেমাত্র আবিষ্কার করেছি যে একটি এএসপি. নেট ওয়েব অ্যাপ্লিকেশনটির প্রতিটি অনুরোধ একটি অনুরোধের শুরুতে একটি সেশন লক পায় এবং তারপরে অনুরোধের শেষে এটি প্রকাশ করে!

এটির প্রভাবগুলি যদি আপনার উপর নষ্ট হয়ে যায়, যেমন এটি প্রথম আমার জন্য ছিল, এর মূলত নিম্নলিখিতটি বোঝানো হয়েছে:

  • যে কোনও সময় কোনও এএসপি.নেট ওয়েবপৃষ্ঠাটি লোড হতে দীর্ঘ সময় নিচ্ছে (সম্ভবত ধীর ডাটাবেস কল বা যে কোনও কারণে) এবং ব্যবহারকারী সিদ্ধান্ত নিয়েছে যে তারা অপেক্ষা করতে করতে ক্লান্ত হয়ে তারা আলাদা পৃষ্ঠায় নেভিগেট করতে চায়, তারা পারে না! এএসপি.নেট সেশন লকটি নতুন পৃষ্ঠার অনুরোধটি মূল অনুরোধটির বেদনাদায়ক ধীরে ধীরে লোড শেষ না হওয়া পর্যন্ত অপেক্ষা করতে বাধ্য করে। Arrrgh।

  • যে কোনও সময় কোনও আপডেটপ্যানেল ধীরে ধীরে লোড হচ্ছে এবং আপডেটপ্যানেলটি আপডেট শেষ করার আগে ব্যবহারকারী আলাদা পাতায় নেভিগেট করার সিদ্ধান্ত নিয়েছে ... তারা পারবে না! এএসপিএনটেশন সেশন লকটি নতুন পৃষ্ঠার অনুরোধটি মূল অনুরোধটির বেদনাদায়ক ধীরে ধীরে লোড শেষ না হওয়া পর্যন্ত অপেক্ষা করতে বাধ্য করে। ডাবল আরআরগ!

তাই বিকল্প কি? এখনও অবধি আমি এনেছি:

  • একটি কাস্টম সেশনস্টেটডেটাস্টোর প্রয়োগ করুন, যা এএসপি.নেট সমর্থন করে। আমি অনুলিপি করার জন্য খুব বেশি কিছু খুঁজে পাইনি এবং এটি একরকম উচ্চ ঝুঁকিপূর্ণ এবং গণ্ডগোলের পক্ষে সহজ বলে মনে হচ্ছে।
  • সমস্ত অনুরোধ অগ্রগতিতে রাখুন, এবং যদি একই ব্যবহারকারীর কাছ থেকে অনুরোধ আসে, মূল অনুরোধটি বাতিল করুন। একধরণের চরম মনে হয় তবে এটি কাজ করবে (আমার মনে হয়)।
  • সেশন ব্যবহার করবেন না! যখন ব্যবহারকারীর জন্য আমার একধরণের অবস্থা দরকার তখন আমি কেবল পরিবর্তে ক্যাশে এবং সত্যায়িত ব্যবহারকারীর নাম বা অন্য কোনও জিনিস ব্যবহার করতে পারি। আবার চরম ধরনের মনে হচ্ছে।

আমি সত্যিই বিশ্বাস করতে পারি না যে এএসপি. নেট মাইক্রোসফ্ট দলটি 4.0 সংস্করণে ফ্রেমওয়ার্কে এত বিশাল পারফরম্যান্সের বাধা ফেলে রেখেছিল! আমি কি স্পষ্ট কিছু মিস করছি? অধিবেশনটির জন্য থ্রেডসেফ সংগ্রহটি ব্যবহার করা কতটা কঠিন?


40
আপনি বুঝতে পারেন যে এই সাইটটি নেট নেট এর উপরে নির্মিত। এটি বলেছিল, আমি মনে করি এটি বেশ সুন্দরভাবে স্কেল করে।
Wheaties

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


4
যদি জোয়েল মুয়েলার আপনার সমস্যা সমাধানের জন্য আপনাকে তথ্য দিয়েছিলেন তবে আপনি কেন তার উত্তরটিকে সঠিক উত্তর হিসাবে চিহ্নিত করলেন না? শুধু একটি ভাবনা.
ars265

1
@ ars265 - জোল মুলার প্রচুর ভাল তথ্য সরবরাহ করেছিলেন এবং আমি তার জন্য তাকে ধন্যবাদ জানাতে চাই। যাইহোক, আমি শেষ পর্যন্ত তার পোস্টে প্রস্তাবিত চেয়ে আলাদা রুট নিয়ে চলেছি। সুতরাং, উত্তর হিসাবে একটি আলাদা পোস্ট চিহ্নিত।
জেমস

উত্তর:


201

যদি আপনার পৃষ্ঠাটি কোনও সেশন ভেরিয়েবলগুলিকে সংশোধন না করে, আপনি এই লকটির বেশিরভাগটি থেকে বেরিয়ে আসতে পারেন।

<% @Page EnableSessionState="ReadOnly" %>

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

<% @Page EnableSessionState="False" %>

যদি আপনার কোনও পৃষ্ঠায় সেশন ভেরিয়েবল ব্যবহার না করা হয় তবে কেবল ওয়েবকনফিগের সেশন স্টেটটি বন্ধ করুন।

<sessionState mode="Off" />

আমি কৌতূহলী, আপনি কী ভাবেন যে "থ্রেডসএফ সংগ্রহ" থ্রেড-সেফ হয়ে উঠবে, যদি এটি লক ব্যবহার না করে?

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

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


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

5
@ জেমস - আমি কেবল এখানে ডিজাইনারদের অনুপ্রেরণাগুলি অনুমান করছি, তবে আমি ধারণা করি যে একক ব্যবহারকারীর অধিবেশনে ব্যবহারের অভাব বা স্বল্প- এর জন্য মুছে ফেলা যায় তার চেয়ে একাধিক মূল্যবোধ একে অপরের উপর নির্ভর করে more স্মৃতি কারণ যে কোনও সময়। যদি কোনও পৃষ্ঠা 4 টি সম্পর্কিত সেশন ভেরিয়েবলগুলি সেট করে এবং অন্য একটি মাত্র দু'টি সংশোধন করার পরে সেগুলি পড়ে, এটি খুব সহজেই কিছু জটিল-নির্ণয়ের জন্য বাগগুলি নির্ধারণ করতে পারে। আমি কল্পনা করেছিলাম যে ডিজাইনাররা সেই কারণে লকিংয়ের উদ্দেশ্যে একক ইউনিট হিসাবে "ব্যবহারকারীর সেশনের বর্তমান অবস্থা" দেখতে পছন্দ করেছেন।
জোয়েল মুয়েলার

2
সুতরাং এমন একটি সিস্টেম বিকাশ করুন যা সর্বনিম্ন সাধারণ ডিনোমিনেটর প্রোগ্রামারগুলিকে পূরণ করে যা লকিং বের করতে পারে না? আইআইএস দৃষ্টান্তের মধ্যে একটি সেশন স্টোর ভাগ করে নেওয়ার জন্য ওয়েব ফার্মগুলি সক্ষম করার উদ্দেশ্য কি? আপনি কি এমন কোনও উদাহরণ দিতে পারেন যা আপনি সেশন ভেরিয়েবলে সঞ্চয় করবেন? আমি কিছু ভাবতে পারি না।
জেসন গোয়েমাট

2
হ্যাঁ, এটি একটি উদ্দেশ্য। অবকাঠামোতে লোড ব্যালেন্সিং এবং রিডানডেন্সি প্রয়োগ করা হলে বিভিন্ন পরিস্থিতিতে পুনর্বিবেচনা করুন। যখন ব্যবহারকারী ওয়েবপৃষ্ঠায় কাজ করে, অর্থাত্ সে ফর্মটিতে ডেটা প্রবেশ করছে, যাক, 5 মিনিট, এবং ওয়েবফর্ম ক্র্যাশ-এর ​​কোনও কিছু - একটি নোডের পাওয়ারসোর্স পাফ হয়ে যায় - ব্যবহারকারীর বিষয়টি লক্ষ্য করা উচিত নয়। তার অধিবেশনটি হারিয়ে যাওয়ার কারণে তাকে অধিবেশন থেকে বের করে দেওয়া যাবে না, কারণ তার কর্মী প্রসেসের অস্তিত্ব নেই। এর অর্থ হ'ল নিখুঁত ভারসাম্য / অপ্রয়োজনীয়তা পরিচালনা করতে, সেশনগুলি কর্মী নোডগুলি থেকে বহিরাগত করতে হবে ..
কোয়েটজলক্যাটল

6
অপ্ট-আউট করার অপর একটি কার্যকর স্তরটি <pages enableSessionState="ReadOnly" />ওয়েবকনফাইগে রয়েছে এবং কেবলমাত্র নির্দিষ্ট পৃষ্ঠায় লেখার জন্য সক্রিয় @ পেজ ব্যবহার করুন।
ম্যাটডব্লিউ

84

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

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateutility.aspx

এই ছিল:

  • বাস্তবায়ন করা খুব দ্রুত (সরবরাহকারীর পথে যাওয়ার চেয়ে সহজ মনে হয়েছিল)
  • বাক্সের বাইরে অনেকগুলি স্ট্যান্ডার্ড এএসপি.নেট সেশন ব্যবহার করেছেন (সেশনস্টেট ইউটিলিটি ক্লাসের মাধ্যমে)

এটি আমাদের অ্যাপ্লিকেশনটির "স্ন্যাপ" অনুভূতিতে একটি বিশাল পার্থক্য তৈরি করেছে। আমি এখনও বিশ্বাস করতে পারি না এএসপি-নেট সেশনটির কাস্টম প্রয়োগটি পুরো অনুরোধটির জন্য সেশনটিকে লক করে। এটি ওয়েবসাইটগুলিতে এত বিশাল আলস্যতা যুক্ত করে। আমাকে যে পরিমাণ অনলাইন গবেষণা করতে হয়েছিল তা বিচার করে (এবং বেশ কয়েকটি সত্যই অভিজ্ঞ এএসপি. নেট বিকাশকারীদের সাথে কথোপকথন), অনেক লোক এই সমস্যাটি অনুভব করেছে, তবে খুব কম লোকই এর কারণটির তলানিতে পৌঁছেছে। সম্ভবত আমি স্কট গু-কে একটি চিঠি লিখব ...

আমি আশা করি এটি সেখানে কয়েকজনকে সাহায্য করবে!


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

3
আমি মনে করি আপনি এই কাজটি করতে পারেন তবে আপনি যদি লোডের নীচে কঠিন থেকে পুনরুত্পাদন ত্রুটিগুলি এড়াতে চান তবে আপনাকে অবশ্যই SessionStateItemCollectionথ্রেড-নিরাপদ শ্রেণীর (সম্ভবত ভিত্তিক ConcurrentDictionary) নমুনা কোডের ব্যবহারটি প্রতিস্থাপন করতে হবে ।
জোয়েল মুয়েলার

3
আমি শুধু একটু বেশি এই দিকে তাকালেন এবং দুর্ভাগ্যবশত ISessionStateItemCollectionপ্রয়োজন Keysসম্পত্তি ধরনের হতে System.Collections.Specialized.NameObjectCollectionBase.KeysCollection- যা কোন পাবলিক কনস্ট্রাকটর হয়েছে। জি, ধন্যবাদ ছেলেরা। এটা খুব সুবিধাজনক।
জোয়েল মুয়েলার

2
ঠিক আছে, আমি বিশ্বাস করি আমার শেষ পর্যন্ত একটি সম্পূর্ণ থ্রেডসেফ রয়েছে, সেশন ওয়ার্কিংয়ের অ-পঠন লকিং বাস্তবায়ন। উপরের মন্তব্যে লিঙ্কিত এমডিএসএন নিবন্ধের ভিত্তিতে কাস্টম থ্রেডসেফ সেশনস্টেট আইটেম সংগ্রহটি বাস্তবায়নের সাথে জড়িত শেষ পদক্ষেপগুলি। ধাঁধাটির চূড়ান্ত টুকরোটি এই দুর্দান্ত নিবন্ধটির ভিত্তিতে একটি থ্রেডসেফ এনুমুরেটর তৈরি করছিল: কোডেপ্রজেক্ট / কেবি / সিএস / নিরাপদ_নুমার.এএসপিএক্স
জেমস

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

31

আমি AngiesList.Redis.RedisSessionStateModule , যা স্টোরেজের জন্য (খুব দ্রুত) রেডিস সার্ভার ব্যবহার বাদ দিয়ে (আমি উইন্ডোজ পোর্ট ব্যবহার করছি - যদিও একটি এমএসওপেনটেক পোর্ট রয়েছে ) ব্যবহার করতে শুরু করেছি, এটি সেশনে একেবারে লকিং করে না ।

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

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


আপনার গিটহাব লিঙ্কটি 404-ডেড বলে মনে হচ্ছে। লাইব্রেরি.আইও / গিথুব / অ্যানজিস্টলিস্ট / এল- রেডিস কি নতুন ইউআরএল বলে মনে হচ্ছে?
উয়ে কেইম

দেখে মনে হচ্ছে লেখক লাইব্রেরিটি সরাতে চেয়েছিলেন, এমনকি দ্বিতীয় লিঙ্কটি থেকে। আমি একটি পরিত্যক্ত গ্রন্থাগার ব্যবহার করতে দ্বিধাগ্রস্ত হতে পারে, কিন্তু সেখানে একটি কাঁটাচামচ এখানে দেওয়া হল: github.com/PrintFleet/AL-Redis এবং একটি বিকল্প লাইব্রেরিটি এখানে থেকে লিঙ্ক: stackoverflow.com/a/10979369/12534
খ্রিস্টান Daven

21

আমি এই থ্রেডে পোস্ট লিঙ্কের উপর ভিত্তি করে একটি গ্রন্থাগার প্রস্তুত করেছি। এটি এমএসডিএন এবং কোডপ্রজেক্টের উদাহরণ ব্যবহার করে। জেমসকে ধন্যবাদ।

আমি জোয়েল মুয়েলারের পরামর্শ অনুসারে পরিবর্তনগুলিও করেছি।

কোড এখানে:

https://github.com/dermeister0/LockFreeSessionState

হ্যাশ টেবিল মডিউল:

Install-Package Heavysoft.LockFreeSessionState.HashTable

স্কেলআউট স্টেট সার্ভার মডিউল:

Install-Package Heavysoft.LockFreeSessionState.Soss

কাস্টম মডিউল:

Install-Package Heavysoft.LockFreeSessionState.Common

আপনি যদি মেমক্যাচড বা রেডিস সমর্থন সমর্থন করতে চান তবে এই প্যাকেজটি ইনস্টল করুন। তারপরে লকফ্রিসেশনস্টেটমডুল ক্লাস উত্তরাধিকারী করুন এবং বিমূর্ত পদ্ধতি প্রয়োগ করুন।

কোডটি এখনও উত্পাদনে পরীক্ষিত হয়নি। ত্রুটি পরিচালনার উন্নতি করতে হবে। ব্যতিক্রমগুলি বর্তমান বাস্তবায়নে ধরা পড়ে না।

রেডিস ব্যবহার করে কিছু লক-মুক্ত সেশন সরবরাহকারী:


এটি স্কেলআউট সমাধান থেকে লাইব্রেরি প্রয়োজন, যা নিখরচায় নয়?
হোং লং

1
হ্যাঁ, আমি কেবল এসওএসএসের জন্য বাস্তবায়ন তৈরি করেছি। আপনি উল্লিখিত রেডিস সেশন সরবরাহকারী ব্যবহার করতে পারেন, এটি বিনামূল্যে।
ডের_মিস্টার

হতে পারে হোং লং এই পয়েন্টটি মিস করেছেন যে আপনার মেমরির হ্যাশ টেবিল বাস্তবায়ন এবং স্কেলআউট স্টেট সার্ভারের মধ্যে একটি পছন্দ আছে।
ডেভিড ডি সলোভার

আপনার অবদানের জন্য ধন্যবাদ :) আমি এটি দেখার চেষ্টা করব যাতে সেশন জড়িত রয়েছে এমন কয়েকটি ব্যবহারের ক্ষেত্রে এটি কীভাবে কাজ করে।
আগুস্টিন গারজন

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

11

আপনার অ্যাপ্লিকেশনটির বিশেষ প্রয়োজন না হলে আমার মনে হয় আপনার কাছে 2 টি পদ্ধতি রয়েছে:

  1. সেশনটি মোটেই ব্যবহার করবেন না
  2. সেশনটি যেমন রয়েছে তেমন ব্যবহার করুন এবং জোল যেমন উল্লিখিত হয়েছে তেমন সূক্ষ্ম সুরক্ষা করুন।

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

আপনি অনেক উপায়ে আচরণের মতো একটি সেশন তৈরি করতে পারেন তবে এটি যদি বর্তমান সেশনটিকে লক না করে তবে এটি 'সেশন' হতে পারবে না।

আপনি উল্লেখ করেছেন এমন নির্দিষ্ট সমস্যার জন্য আমি মনে করি আপনার HttpContext.Current.Response.IsClientCnnected চেক করা উচিত । এটি অপ্রয়োজনীয় মৃত্যুদণ্ড রোধ করতে এবং ক্লায়েন্টের জন্য অপেক্ষা করতে দরকারী হতে পারে, যদিও এটি এই সমস্যাটিকে পুরোপুরি সমাধান করতে পারে না, কারণ এটি কেবল একটি পুলিং উপায়ে ব্যবহার করা যেতে পারে এবং async নয়।


10

আপনি যদি আপডেটটি ব্যবহার করেন Microsoft.Web.RedisSessionStateProvider(শুরু করে 3.0.2) আপনি সামনের web.configসেশনগুলির অনুমতি দেওয়ার জন্য এটিতে এটি যুক্ত করতে পারেন ।

<appSettings>
    <add key="aspnet:AllowConcurrentRequestsPerSession" value="true"/>
</appSettings>

উৎস


কেন এটি 0. +1 এ ছিল তা নিশ্চিত নয়। খুব দরকারী.
পানগামা

এই ক্লাসিক মোড অ্যাপ পুল কাজ করে? github.com/Azure/aspnet-redis-provider/issues/123
মরিচা

এটি ডিফল্ট ইনপ্রোক বা সেশন রাজ্য পরিষেবা সরবরাহকারীর সাথে কাজ করে?
নিক চ্যান আবদুল্লাহ

নোট করুন যে আপনি যদি রেডিসেস্টেশনস্টেটপ্রোভাইডার ব্যবহার করে থাকেন তবে পোস্টারটি উল্লেখ করেছে তবে এটি নতুন এসপনেটসেশনস্টেট অ্যাসিঙ্ক সরবরাহকারীদের (এসকিউএল এবং কসমোসের জন্য) সাথেও কাজ করতে পারে কারণ এটি তাদের ডকুমেন্টেশনেও রয়েছে: github.com/aspnet/AspNetSessionState আমার ধারণা এটি কাজ করবে ক্লাসিকমোড যদি সেশনস্টেটপ্রোভিডার ইতিমধ্যে ক্লাসিক মোডে কাজ করে, সম্ভবত এএসপি.নেটের অভ্যন্তরে সেশন স্টেট স্টাফ ঘটে (আইআইএস নয়)। ইনপ্রোকের সাথে এটি কাজ নাও করতে পারে তবে কোনও সমস্যার চেয়ে কম হবে কারণ এটি কোনও সংস্থান বিষয়বস্তু সম্পর্কিত সমস্যা সমাধান করে যা প্রকল্পের পরিস্থিতিগুলির বাইরে একটি বড় চুক্তি।
ম্যাডিশন

4

এএসপনেট এমভিসির জন্য আমরা নিম্নলিখিতগুলি করেছি:

  1. ডিফল্টরূপে, SessionStateBehavior.ReadOnlyওভাররাইড করে সমস্ত নিয়ামকের ক্রিয়া সেট করুন setDefaultControllerFactory
  2. নিয়ন্ত্রক ক্রিয়াকলাপে যা সেশন স্টেটে লেখার প্রয়োজন রয়েছে তাতে এটিকে সেট করার জন্য অ্যাট্রিবিউট দিয়ে চিহ্নিত করুন SessionStateBehavior.Required

কাস্টম কন্ট্রোলারফ্যাক্টরি তৈরি করুন এবং ওভাররাইড করুন GetControllerSessionBehavior

    protected override SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType)
    {
        var DefaultSessionStateBehaviour = SessionStateBehaviour.ReadOnly;

        if (controllerType == null)
            return DefaultSessionStateBehaviour;

        var isRequireSessionWrite =
            controllerType.GetCustomAttributes<AcquireSessionLock>(inherit: true).FirstOrDefault() != null;

        if (isRequireSessionWrite)
            return SessionStateBehavior.Required;

        var actionName = requestContext.RouteData.Values["action"].ToString();
        MethodInfo actionMethodInfo;

        try
        {
            actionMethodInfo = controllerType.GetMethod(actionName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
        }
        catch (AmbiguousMatchException)
        {
            var httpRequestTypeAttr = GetHttpRequestTypeAttr(requestContext.HttpContext.Request.HttpMethod);

            actionMethodInfo =
                controllerType.GetMethods().FirstOrDefault(
                    mi => mi.Name.Equals(actionName, StringComparison.CurrentCultureIgnoreCase) && mi.GetCustomAttributes(httpRequestTypeAttr, false).Length > 0);
        }

        if (actionMethodInfo == null)
            return DefaultSessionStateBehaviour;

        isRequireSessionWrite = actionMethodInfo.GetCustomAttributes<AcquireSessionLock>(inherit: false).FirstOrDefault() != null;

         return isRequireSessionWrite ? SessionStateBehavior.Required : DefaultSessionStateBehaviour;
    }

    private static Type GetHttpRequestTypeAttr(string httpMethod) 
    {
        switch (httpMethod)
        {
            case "GET":
                return typeof(HttpGetAttribute);
            case "POST":
                return typeof(HttpPostAttribute);
            case "PUT":
                return typeof(HttpPutAttribute);
            case "DELETE":
                return typeof(HttpDeleteAttribute);
            case "HEAD":
                return typeof(HttpHeadAttribute);
            case "PATCH":
                return typeof(HttpPatchAttribute);
            case "OPTIONS":
                return typeof(HttpOptionsAttribute);
        }

        throw new NotSupportedException("unable to determine http method");
    }

AcquireSessionLockAttribute

[AttributeUsage(AttributeTargets.Method)]
public sealed class AcquireSessionLock : Attribute
{ }

তৈরি করা কন্ট্রোলার কারখানায় প্রবেশ করুন global.asax.cs

ControllerBuilder.Current.SetControllerFactory(typeof(DefaultReadOnlySessionStateControllerFactory));

এখন, আমরা উভয় read-onlyএবং read-writeএকক ক্ষেত্রে সেশন স্থিতি রাখতে পারি Controller

public class TestController : Controller 
{
    [AcquireSessionLock]
    public ActionResult WriteSession()
    {
        var timeNow = DateTimeOffset.UtcNow.ToString();
        Session["key"] = timeNow;
        return Json(timeNow, JsonRequestBehavior.AllowGet);
    }

    public ActionResult ReadSession()
    {
        var timeNow = Session["key"];
        return Json(timeNow ?? "empty", JsonRequestBehavior.AllowGet);
    }
}

দ্রষ্টব্য: এএসপনেট সেশন রাষ্ট্রটি এখনও কেবল পাঠযোগ্য মোডে লেখা যেতে পারে এবং কোনওরকম ব্যতিক্রম ছুঁড়ে মারবে না (এটি ধারাবাহিকতার গ্যারান্টি দেওয়ার জন্য লক করে না) সুতরাং আমাদের AcquireSessionLockনিয়ন্ত্রকের ক্রিয়াকলাপগুলিতে চিহ্নিত হওয়ার জন্য সতর্কতা অবলম্বন করতে হবে যা অধিবেশন রাষ্ট্রের লেখার প্রয়োজন।



3

নিয়ামকের সেশন স্থিতিকে কেবল পঠনযোগ্য বা অক্ষম হিসাবে চিহ্নিত করা হচ্ছে সমস্যার সমাধান করবে

এটি কেবলমাত্র পঠনযোগ্য হিসাবে চিহ্নিত করতে আপনি নিম্নলিখিত বৈশিষ্ট্য সহ একটি নিয়ামককে সজ্জিত করতে পারেন:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

সিস্টেম . ওয়েবে.সেশনস্টেট.সেশনস্টেট বিহেভিয়ার এনামের নিম্নলিখিত মান রয়েছে:

  • ডিফল্ট
  • অক্ষম
  • শুধুমাত্র পাঠযোগ্য
  • প্রয়োজনীয়

0

এই সমস্যাটি সহ যে কাউকে সহায়তা করার জন্য (একই অধিবেশন থেকে অন্য একজনের সম্পাদনার সময় লক অনুরোধগুলি) ...

আজ আমি এই সমস্যাটি সমাধান করতে শুরু করেছি এবং কয়েক ঘন্টা গবেষণার পরে, আমি গ্লোবাল.এক্স্যাক্স ফাইলটি Session_Startথেকে পদ্ধতিটি (খালি হলেও) সরিয়ে সমাধান করেছি ।

আমি পরীক্ষিত সমস্ত প্রকল্পে এটি কাজ করে।


আইডিকে এটি কী ধরণের প্রকল্প চালু ছিল, তবে খনিতে কোনও Session_Startপদ্ধতি নেই এবং এখনও লক রয়েছে
ডেনিস জি ল্যাব্রেক্ক

0

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

http://www.drupalonwindows.com/en/content/token-sessionstate

সুবিধাদি:

  • ড্রপ-ইন প্রতিস্থাপন, আপনার কোডে কোনও পরিবর্তন প্রয়োজন
  • কোনও সেন্ট্রালাইজড স্টোরের চেয়ে ভাল স্কেল করুন, কারণ কোনও সেশনের স্টোরেজ ব্যাকএন্ডের প্রয়োজন নেই।
  • যে কোনও সেশনের স্টোরেজ থেকে কোনও ডেটা পুনরুদ্ধার করা দরকার না হওয়ায় অন্য কোনও সেশন স্টোরেজের চেয়ে দ্রুততর
  • সেশন স্টোরেজের জন্য কোনও সার্ভার সংস্থান গ্রহণ করে না।
  • ডিফল্ট অ-অবরুদ্ধকরণ বাস্তবায়ন: একযোগে অনুরোধ একে অপরকে অবরুদ্ধ করবে না এবং সেশনে একটি লক ধরে রাখবে না
  • অনুভূমিকভাবে আপনার অ্যাপ্লিকেশনটি স্কেল করুন: কারণ সেশন ডেটা অনুরোধের সাথেই ভ্রমণ করে আপনি সেশন ভাগ করে নেওয়ার চিন্তা না করে একাধিক ওয়েব হেড রাখতে পারেন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.