2008-10-25 12 views
16

TempData का उपयोग करते समय, मेरी समझ यह है कि यह केवल एक ही अनुरोध के लिए आप जो कुछ भी डालते हैं वह रखेगा। तो जब एक रीडायरेक्ट में डेटा को बनाए रखने के लिए TempData का उपयोग करते समय (पोस्ट-अनुरोध-गेट पैटर्न का उपयोग करने के लिए), यह संभव नहीं है कि उपयोगकर्ता से कुछ अन्य अनुरोध रीडायरेक्ट भेजने के जवाब में सर्वर में आ सकता है और उपयोगकर्ता का ब्राउजर रीडायरेक्ट-टू पेज का अनुरोध करता है? किस मामले में अब TempData उपलब्ध नहीं होगा, सही?क्या रीडायरेक्ट में Asp.Net MVC TempData का उपयोग करते समय कोई संभावित "रेस हालत" है?

अब, मैं समझता हूं कि ऐसा कुछ घटित होना बहुत दुर्लभ होगा, लेकिन इस बात को ध्यान में रखते हुए कि उपयोगकर्ता के पास एक और टैब दूसरे टैब में खुल सकता है, और उस पृष्ठ पर होने वाले अजाक्स या समय के कॉलबैक अनुरोध हो सकते हैं, अचानक मेरे लिए असंभव प्रतीत नहीं होता है। क्या इसे आम तौर पर चिंता करने के लिए बहुत दूर माना जाता है, या क्या मैं कुछ गलत समझ रहा हूं?

संपादित करें: परिदृश्य के बारे में अधिक विशिष्ट होने के लिए मैं पूछ रहा था।

  1. टैब 1 में उपयोगकर्ता को कोई पद प्रपत्र के साथ एक पृष्ठ को ब्राउज़
  2. टैब 2 साइट है कि एक टाइमर
  3. पर ajax कॉलबैक करता टैब 1 में के किसी दूसरे पृष्ठ उपयोगकर्ता ब्राउज़रों में, उपयोगकर्ता पदों सर्वर
  4. जब सर्वर पद प्राप्त करता है रूप है, यह TempData में कुछ डेटा बचाता है और एक रीडायरेक्ट प्रतिक्रिया
  5. टैब 2 में, समय समाप्त हो गया ajax कॉलबैक होता वापस भेजता है, के लिए एक GET अनुरोध भेजने सर्वर। TempData सत्र
  6. टैब 1 में से निकाल दिया जाता है, तो ब्राउज़र रीडायरेक्ट और मुद्दों GET अनुरोध
  7. सर्वर GET अनुरोध संसाधित करता है और TempData के लिए लग रहा है प्राप्त करता है, लेकिन यह

उत्तर

9

ठीक है, एएसपी.नेट एमवीसी कोड ब्राउज़ करने से पता चलता है कि समय में TempData संग्रहीत किया जाता है, इसे लोड होने पर सत्र से निकाल दिया जाता है। और यह नियंत्रक ExecuteCore() विधि में लोड हो जाता है।

तो मुझे लगता है कि इसका मतलब यह होगा कि हाँ, आप पूरी तरह दौड़ दौड़ में भाग सकते हैं जहां एक अलग ब्राउज़र टैब से अनुरोध (आपके पास एक बहुत अच्छा उदाहरण था) इस समस्या का कारण बन सकता है। लेकिन यह अनुरोधों को संभालने के लिए प्रत्येक ब्राउज़र के मॉडल पर निर्भर करेगा। एक ब्राउज़र एक ही सर्वर पर सभी अनुरोधों को क्रमबद्ध कर सकता है ताकि एक समय में केवल एक ही निष्पादित हो। हकीकत में, वे ऐसा नहीं करेंगे, हालांकि, वे इसे अधिकतम पर कैप्चर करेंगे (मुझे लगता है) उसी सर्वर पर 5 समवर्ती अनुरोध।

यह देखते हुए कि एक एएसपी.नेट एमवीसी साइट किसी भी ब्राउज़र के लिए सेवा अनुरोध हो सकती है (यह वेब है, बाद में :)) यह वास्तविक परिदृश्य है, यद्यपि शायद यह एक दुर्लभ है, जैसा कि आपने कहा था।

+0

आप सही हैं। यदि दो ब्राउज़र विंडो एक ही सत्र साझा करते हैं, तो वे एक ही TempData साझा करते हैं। आपको सावधान रहना चाहिए कि आपने इस कारण से TempData में क्या रखा है; फ़्लैश स्टेटस संदेश ठीक हैं (गलत ब्राउज़र में दिखाना थोड़ा अजीब है लेकिन हानिकारक नहीं है)। –

+0

प्रश्न में 7-चरणीय परिदृश्य में, यह कोई फर्क नहीं पड़ता कि ब्राउज़र सर्वर से सभी अनुरोधों को क्रमबद्ध करता है या नहीं। वास्तव में, परिदृश्य को पोस्ट-रिटर्निंग-रीडायरेक्ट, AJAX-GET, GET-redirection-location के रूप में क्रमबद्ध किया गया है। इसका मतलब है कि AJAX-GET TempData प्राप्त करेगा। – bzlm

+0

साथ ही, क्या आईआईएस उसी सत्र से सभी अनुरोधों को क्रमबद्ध नहीं करता है जैसे ही आप सत्र राज्य का उपयोग करते हैं? पुराने दिनों में यह निश्चित रूप से सच था। यह इस तथ्य पर ज़ोर देगा कि धारावाहिकता का अनुरोध कोई फर्क नहीं पड़ता। – bzlm

0

अब वहां नहीं है TempData सत्र ऑब्जेक्ट का उपयोग करता है, जो इस समस्या को पीड़ित नहीं करता है, AFAIK। क्या आप इसके साथ एक विशिष्ट समस्या में भाग गए हैं?

+0

मैंने अपने प्रश्न को उस परिदृश्य को स्पष्ट करने के लिए अपडेट किया जिसके बारे में मैं पूछ रहा हूं। अब, मैं समझता हूं कि मेरा परिदृश्य बहुत दुर्लभ है, लेकिन अभी भी सत्र में डेटा संग्रहीत करने और अनुरोध के बाद इसे मैन्युअल रूप से हटाने पर मुझे TempData का उपयोग करने में संकोच करने के लिए पर्याप्त है। –

+1

क्या "सत्र ऑब्जेक्ट" में यह समस्या नहीं है? यदि आप सभी कार्रवाइयों में सत्र ["Temp"] = null' (जो TempData प्रभावी ढंग से करता है, है ना?), तो किसी अन्य क्रिया पर रीडायरेक्ट करने वाली कार्रवाई गलत तरीके से मानी जाएगी कि "[Temp"] उस अन्य क्रिया में उपलब्ध है। – bzlm

4

TempData का उपयोग करते समय दौड़ की स्थिति पूरी तरह से संभव है। हालांकि, आपको सामान्य उपयोग के तहत इसका अनुभव करने के लिए निश्चित रूप से "दुर्भाग्यपूर्ण" होना होगा। दौड़ की स्थिति में भाग लेने के लिए निम्नलिखित सभी सत्य होना चाहिए:

  1. आपको शुरुआत करने के लिए TempData का उपयोग करना होगा।
  2. आपके पास एक ही ब्राउज़र सत्र खोलने और साझा करने के लिए कई ब्राउज़र विंडो/टैब/व्हाटर्स होना चाहिए।
  3. दूसरे ब्राउज़र टैब से अनुरोध को पहले ब्राउज़र टैब के अनुरोध और प्रतिक्रिया के बीच "चुपके" करना होगा।

ध्यान दें कि आइटम # 2 उस ब्राउज़र पर निर्भर करता है जिस पर आप उपयोग कर रहे हैं। आपके द्वारा आईई सेट अप करने के आधार पर, सिर्फ इसलिए कि आपके पास कई खिड़कियां खोली गई हैं, इसका मतलब यह नहीं है कि वे ब्राउज़र कुकीज़ साझा करते हैं, और इस प्रकार वे आवश्यक रूप से सत्र साझा नहीं करते हैं (जो कुकीज़ पर आधारित होते हैं)।

हालांकि, इस अर्थ में कोई दौड़ स्थिति नहीं है कि अगर आप इसमें भाग लेते हैं तो कुछ विस्फोट होता है। हो सकता है कि हैकड इस बात का जिक्र कर रहा हो। लेकिन आप इस शर्त में दौड़ की स्थिति को हिट कर सकते हैं कि आपने एक अनुरोध में कुछ टेम्पैडाटा सेट किया है और फिर उसे अगले अनुरोध में वापस नहीं मिला है जहां आप सोचा आपको यह प्राप्त करने जा रहे थे। यह बस खाली हो जाएगा।

धन्यवाद, Eilon

+0

तो, यह आपकी साइट * डिज़ाइन * TempData का समर्थन करेगा या नहीं, यह उबालता है। यह सभी quirks की विविधता की तरह लगता है जो हमेशा सत्र स्थिति का उपयोग कर आते हैं। पसंद; कुकीज़ अक्षम किया जा सकता है; साइट पर जाने के दौरान कुकीज़ हटा दी जा सकती है आदि – bzlm

0

मुझे लगता है कि ऐसा कभी नहीं हो जाएगा, हालांकि शुरुआत में मैं एक ही confusion.Think है के बारे में है कि यदि आप डिबग मोड में अपने MVC वेब अनुप्रयोग चलाते हैं, तो आप में एक को तोड़ने बिंदु निर्धारित एक रीडायरेक्ट एक्शन .और आप tempdata को एक मान देते हैं, तो आपको रीडायरेक्ट व्यू रीसेट और अन्य दृश्य में tempdate मिल जाएगा, आपको पता चलेगा कि अन्य अनुरोध को कभी भी प्रतिक्रिया नहीं दी जाती है जब तक कि रीडायरेक्ट एक्शन पूरा नहीं हो जाता.तो इसका क्या मतलब है? उसने कहा कि एमवीसी एप्लीकेशन एकल थ्रेड मोड में चलाया जाता है, यह एक बार में एक ही अनुरोध को संसाधित कर सकता है। इसलिए आपके ऊपर वर्णित परिदृश्य कभी नहीं हो सकता है।

संबंधित मुद्दे