दिलचस्प पोस्ट
पारभासी फ्रेम / पैनल / घटक पर फिर से पेंट करें। क्या ये JSON परिणामों में फ़ंक्शन को परिभाषित करने के लिए मान्य है? अपने माता-पिता की 100% ऊँचाई कैसे तैयार करें? क्यों पूर्वप्रक्रमक मैक्रोज़ बुरा है और विकल्प क्या हैं? मैं किसी तालिका या स्तंभ में सभी विदेशी कुंजियों को कैसे देखूं? AJAX क्रॉस डोमेन कॉल बिल्ड नंबर बढ़ाने का बेहतर तरीका? सूची और ArrayList के बीच अंतर क्या है? वेबफॉर्म्स UnobtrusiveValidationMode को 'jquery' के लिए एक ScriptResourceMapping की आवश्यकता है कृपया एक जेपीआरआरससोर्समैपिंग जेक्जरी (केस-संवेदी) नाम दें C # में उपज की गई कीवर्ड क्या है? निर्माण x = x || क्या करता है y मतलब है? मैं एंड्रॉइड में एक PreferenceActivity से SharedPreferences कैसे प्राप्त करूं? एंड्रॉइड – वॉलपेपर छवि कैसे सेट करें यूनिक्स में एकाधिक फ़ाइलों का नाम बदलें आप एक EC2 आवृत्ति में स्वैप कैसे जोड़ सकते हैं?

मुझे अभी पता चला है कि सभी एएसपी.नेट वेबसाइट धीमे क्यों हैं, और मैं इस बारे में काम करने की कोशिश कर रहा हूं

मुझे पता चला कि एएसपी.Net वेब अनुप्रयोग में हर अनुरोध एक अनुरोध की शुरुआत में एक सत्र लॉक हो जाता है, और फिर अनुरोध के अंत में इसे रिलीज़ करता है!

यदि इस पर आपके पर प्रभाव पड़ता है, जैसे कि यह पहले मेरे लिए था, तो इसका मूल रूप से निम्न का अर्थ है:

तो, विकल्प क्या हैं? अब तक मैं के साथ आया है:

  • एक कस्टम सत्र स्टैटडेटास्टोर लागू करें, जो कि ASP.Net का समर्थन करता है मुझे प्रतिलिपि बनाने के लिए वहां बहुत सारे नहीं मिले हैं, और यह उच्च जोखिम और गड़बड़ करने के लिए आसान लगता है।
  • सभी अनुरोधों का ध्यान रखें प्रगति पर है, और यदि एक ही उपयोगकर्ता से एक अनुरोध आता है, तो मूल अनुरोध रद्द करें। चरम तरह दिखता है, लेकिन यह काम करेगा (मुझे लगता है)।
  • सत्र का उपयोग न करें! जब मुझे उपयोगकर्ता के लिए किसी तरह का राज्य की आवश्यकता होती है, तो मैं इसके बजाय कैश का उपयोग कर सकता था, और प्रमाणीकृत उपयोगकर्ता नाम पर कुंजी आइटम या कुछ ऐसी चीज़ फिर से चरम की तरह लगता है

मैं वास्तव में विश्वास नहीं कर सकता कि एएसपी.नेट माइक्रोसॉफ्ट टीम ने संस्करण 4.0 में ढांचे में इस तरह के एक बहुत बड़ा प्रदर्शन बाधा छोड़ दिया होगा! क्या मुझसे साफ़ – साफ़ कुछ चीज़ चूक रही है? सत्र के लिए थ्रेडसेफ संग्रह का उपयोग कैसे करना कठिन होगा?

वेब के समाधान से एकत्रित समाधान "मुझे अभी पता चला है कि सभी एएसपी.नेट वेबसाइट धीमे क्यों हैं, और मैं इस बारे में काम करने की कोशिश कर रहा हूं"

यदि आपका पृष्ठ किसी भी सत्र चर को संशोधित नहीं करता है, तो आप इनमें से अधिक लॉक का विकल्प चुन सकते हैं।

<% @Page EnableSessionState="ReadOnly" %> 

यदि आपका पृष्ठ किसी भी सत्र चर को नहीं पढ़ता है, तो आप उस पृष्ठ के लिए, इस लॉक से पूरी तरह से ऑप्ट आउट कर सकते हैं।

 <% @Page EnableSessionState="False" %> 

यदि आपके पृष्ठों में से कोई भी सत्र चर का उपयोग नहीं करता है, तो web.config में सत्र स्थिति को बंद करें।

 <sessionState mode="Off" /> 

मैं उत्सुक हूँ, आप क्या सोचते हैं "थ्रेडसेफ संग्रह" क्या थ्रेड सुरक्षित बनने के लिए करेगा, अगर यह ताले का उपयोग नहीं करता है?

संपादित करें: मुझे शायद यह समझाना चाहिए कि "इस लॉक के अधिकांश में से ऑप्ट आउट" से मेरा क्या मतलब है? एक-दूसरे को अवरुद्ध किए बिना एक ही समय में किसी भी सत्र के लिए केवल-पढ़ने के सत्र या सत्र-सत्र पृष्ठों पर संसाधित किया जा सकता है। हालांकि, एक पठन-लेखन-सत्र पृष्ठ प्रसंस्करण शुरू नहीं कर सकता जब तक कि सभी पठन-केवल अनुरोध पूरा न हो जाएं, और जब यह चल रहा है, तो निरंतरता बनाए रखने के लिए उस उपयोगकर्ता के सत्र में अनन्य पहुंच होनी चाहिए। व्यक्तिगत मूल्यों पर लॉकिंग काम नहीं करेगी, क्योंकि एक पृष्ठ एक समूह के रूप में संबंधित मानों का एक सेट बदलता है या नहीं। आप कैसे सुनिश्चित करेंगे कि एक ही समय में चल रहे अन्य पेजों को उपयोगकर्ता के सत्र चर का लगातार विचार मिलेगा?

मैं सुझाव दे सकता हूं कि यदि एक बार सेट किए जाने के बाद, यदि संभव हो तो सत्र चर को संशोधित करने के लिए कम से कम करने का प्रयास करें यह आपको अपने पृष्ठों को केवल पढ़ने के लिए-सत्र वाले पेजों को बनाने की अनुमति देगा, इस मौके को बढ़ाना होगा कि एक ही उपयोगकर्ता से कई युगपत अनुरोध प्रत्येक दूसरे को ब्लॉक नहीं करेगा।

ठीक है, जोएल मुलर को उसके सभी इनपुट के लिए इतनी बड़ी प्रॉप्स मेरा अंतिम समाधान इस एसएसडीएन लेख के अंत में विस्तृत कस्टम सत्र की स्थिति का उपयोग करना था:

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

यह था:

  • लागू करने के लिए बहुत जल्दी (वास्तव में प्रदाता मार्ग जाने से आसान लग रहा था)
  • मानक एएसपी.Net सत्र को बॉक्स के बाहर से निपटने में बहुत सारे प्रयोग किया जाता है (सत्र सत्र माध्यम के माध्यम से)

इसने हमारे आवेदन के लिए "स्नैपिनेस" की भावना के लिए बड़ा अंतर बना दिया है मैं अभी भी विश्वास नहीं कर सकता कि एएसपी.नेट सत्र के कस्टम कार्यान्वयन पूरे अनुरोध के लिए सत्र को लॉक करता है। यह वेबसाइटों के लिए इतनी बड़ी रौंदता जोड़ता है ऑनलाइन शोध की मात्रा को देखते हुए मुझे (और कई अनुभवी एएसपी.Net डेवलपर्स के साथ बातचीत) करना था, बहुत सारे लोगों ने इस मुद्दे का अनुभव किया है, लेकिन बहुत कम लोगों को इस कारण के नीचे मिला है। शायद मैं स्कॉट गुजरात को एक पत्र लिखूंगा …

मुझे उम्मीद है कि इसमें कुछ लोगों को मदद मिलेगी!

मैंने AngiesList.Redis.RedisSessionStateModule का उपयोग करना शुरू कर दिया, जो कि भंडारण के लिए (बहुत तेज़) Redis सर्वर का उपयोग करने से (मैं खिड़कियां बंदरगाह का उपयोग कर रहा हूं – यद्यपि वहाँ भी एक MSOpenTech पोर्ट है ) का उपयोग करना शुरू कर दिया है, यह बिल्कुल सत्र पर लॉकिंग नहीं करता है ।

मेरी राय में, यदि आपके आवेदन को उचित तरीके से संरचित किया गया है, तो यह समस्या नहीं है। यदि आपको वास्तव में लॉक किया गया है, सत्र के एक हिस्से के रूप में सुसंगत डेटा की आवश्यकता है, तो आपको अपने स्वयं के लॉक / संगामिति जांच को विशेष रूप से लागू करना चाहिए।

एमएस ने तय किया कि हर एएसपी.नेट सत्र को डिफ़ॉल्ट रूप से लॉक किया जाना चाहिए, केवल खराब एप्लीकेशन डिज़ाइन को संभालने के लिए मेरा फैसला एक बुरा निर्णय है। खासकर क्योंकि ऐसा लगता है कि अधिकांश डेवलपर्स / सत्रों का एहसास भी नहीं था कि वे लॉक हुए थे, अकेले ऐप्पल को स्पष्ट रूप से संरचित करने की आवश्यकता है ताकि आप जितना संभव हो सके केवल पढ़ने योग्य सत्र स्थिति (ऑप्ट-आउट, जहां संभव हो) कर सकें। ।

मैंने इस धागे में पोस्ट किए लिंक के आधार पर एक पुस्तकालय तैयार किया है। यह MSDN और CodeProject से उदाहरणों का उपयोग करता है जेम्स के लिए धन्यवाद

मैंने जोएल म्यूएलर द्वारा भी संशोधनों की सलाह दी

कोड यहाँ है:

https://github.com/dermeister0/LockFreeSessionState

हैशटेबल मॉड्यूल:

 Install-Package Heavysoft.LockFreeSessionState.HashTable 

स्केलऑट स्टेटसर्वर मॉड्यूल:

 Install-Package Heavysoft.LockFreeSessionState.Soss 

कस्टम मॉड्यूल:

 Install-Package Heavysoft.LockFreeSessionState.Common 

यदि आप मेमकैच या रेडिस के समर्थन को लागू करना चाहते हैं, तो यह पैकेज इंस्टॉल करें। फिर LockFreeSessionStateModule वर्ग को प्राप्त करें और सार तरीकों को लागू करें।

कोड को अभी तक उत्पादन पर परीक्षण नहीं किया गया है इसके अलावा त्रुटि से निपटने में सुधार की आवश्यकता है। वर्तमान कार्यान्वयन में अपवाद पकड़े नहीं गए हैं

रेडिस का उपयोग करने वाले कुछ लॉक-फ़्री सत्र प्रदाताओं:

जब तक आपके आवेदन की विशेष आवश्यकता नहीं है, मुझे लगता है कि आपके पास 2 दृष्टिकोण हैं:

  1. सत्र का बिल्कुल उपयोग न करें
  2. सत्र का प्रयोग करें जैसा है और ठीक ट्यूनिंग के रूप में उल्लिखित जॉयल

सत्र न केवल धागा-सुरक्षित है लेकिन यह भी राज्य-सुरक्षित है, जिस तरह से आप जानते हैं कि जब तक वर्तमान अनुरोध पूरा नहीं हो जाता है, प्रत्येक सत्र चर एक अन्य सक्रिय अनुरोध से परिवर्तित नहीं होता है ऐसा होने के लिए आपको यह सुनिश्चित करना होगा कि वर्तमान अनुरोध पूरा होने तक सत्र बंद हो जाएगा।

आप कई तरह से व्यवहार जैसे सत्र बना सकते हैं, लेकिन यदि यह वर्तमान सत्र को लॉक नहीं करता है, तो यह 'सत्र' नहीं होगा।

आपके द्वारा उल्लिखित विशिष्ट समस्याओं के लिए, मुझे लगता है कि आपको एचटीटीपी कॉन्टेक्सचालू करना चाहिए। रिस्पॉन्सआईएसएलएलटी कनेक्ट । यह अनावश्यक फांसी को रोकने के लिए उपयोगी हो सकता है और क्लाइंट पर इंतजार कर रहा है, हालांकि यह पूरी तरह से इस समस्या को हल नहीं कर सकता है, क्योंकि इसका उपयोग केवल एक पूलिंग तरीके से किया जा सकता है और async न हो

एएसपीएनईटी एमवीसी के लिए, हमने निम्नलिखित किया:

  1. डिफ़ॉल्ट रूप से, SessionStateBehavior.ReadOnly सेट करें। केवल नियंत्रक की कार्रवाई को ओवरराइड करना डिफ़ॉल्ट कंट्रोलरफ़ीटर द्वारा
  2. सत्र राज्य को लिखने की आवश्यकता वाले नियंत्रक कार्यों पर, सत्र के साथ चिह्न को सेट करें सत्र सत्र में सेट करें।

कस्टम कंट्रोलर GetControllerSessionBehaviour बनाएं और GetControllerSessionBehaviour ओवरराइड करें

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

अब, हम एक एकल Controller में read-only read-write और सत्र read-write सकते हैं।

 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 सत्र को चिह्नित करने के लिए सावधान रहना होगा जो सत्र स्थिति लेखन की आवश्यकता है ।

नियंत्रक के सत्र अवस्था को पठनीय या अक्षम के रूप में चिह्नित करना समस्या का समाधान करेगा।

आप निम्न विशेषता के साथ एक नियंत्रक को केवल-पढ़ने के लिए चिह्नित करने के लिए सज सकते हैं:

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

System.Web.SessionState.SessionStateBehavior enum के पास निम्न मान हैं:

  • चूक
  • विकलांग
  • सिफ़ पढ़िये
  • अपेक्षित

बस इस समस्या से किसी को मदद करने के लिए (एक ही सत्र से दूसरे को निष्पादित करते समय अनुरोधों को लॉक करना) …

आज मैंने इस मुद्दे को हल करना शुरू कर दिया और, अनुसंधान के कुछ घंटों के बाद, मैंने इसे Global.asax फ़ाइल से Session_Start विधि (यहां तक ​​कि खाली) को निकालकर हल किया।

यह मैंने सभी परियोजनाओं में काम किया है।