2009-08-09 16 views
34

क्या Response.Redirect() वर्तमान में निरस्त करने के लिए चल रही विधि का कारण बनता है? या Response.Redirect() निष्पादित करने के बाद कोड भी करता है?एएसपी.नेट: Response.Redirect (...) के बाद कोड के साथ क्या होता है?

(यही कारण है, यह एक Response.Redirect के बाद वापस जाने के लिए/बाहर निकलें उप? आवश्यक है)

उत्तर

27

यह एक पूरा जवाब नहीं हो सकता है, लेकिन मैं क्या देखा है से ...

रिस्पांस .Redirect करता है, वास्तव में कोड को सिस्टम फेंक कर कोड को निष्पादित करना बंद कर देता है। थ्रेडिंग। थ्रेडएबॉर्ट अपवाद।

ग्लोबल में ग्लोबल एरर हैंडलिंग स्थापित करके आप इसे अपने लिए देख सकते हैं। एएक्सएक्स और एक Response.Redirect का परीक्षण।

पुनर्निर्देशन कॉल समाप्त हो जो पूरा होने पर एक ThreadAbortException अपवाद को जन्म देती है:

संपादित

और यहाँ प्रलेखन कि मेरा उत्तर का समर्थन करता है के लिए एक कड़ी है।

HttpResponse.Redirect Method (String, Boolean) (System.Web)

1

मेरे समझ है कि एक Response.Redirect() जारी करने की बात है, कोड निम्नलिखित निष्पादित नहीं होगा। यदि आप इसके बारे में सोचते हैं, तो यह समझ में आता है कि इसे निष्पादित न करें। आप मूल रूप से अपना कोड बता रहे हैं कि आप कहीं और जाना चाहते हैं।

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

+1

मुझे वास्तविक दुनिया के उदाहरण का उपयोग पसंद है। – David

+3

मैं कहूंगा कि यह एक समानता थी, वास्तविक दुनिया का उदाहरण नहीं। एक आरडब्ल्यूई एएसपी.नेट फ्रेमवर्क और डेवलपर के कोड के अंदर क्या होता। –

45

Response.Redirect में एक बूलियन तर्क स्वीकार करने वाला अधिभार है जो इंगित करता है कि Response.Redirect पर कॉल प्रतिक्रिया को समाप्त करना चाहिए। इस तर्क के बिना ओवरलोड को कॉल करना true निर्दिष्ट करने के समान है, यह इंगित करने के लिए कि प्रतिक्रिया समाप्त होनी चाहिए।

प्रतिक्रिया समाप्त मतलब यह है कि Response.End के बाद प्रतिक्रिया रीडायरेक्ट ऐसा करने के लिए संशोधित किया गया है कहा जाता है, और Response.End एक ThreadAbortException फेंकता वर्तमान मॉड्यूल समाप्त करने के लिए।

Response.Redirect पर कॉल के बाद कोई भी कोड कभी भी नहीं कहा जाता है (जब तक आप अतिरिक्त तर्क के लिए false की आपूर्ति नहीं करते)। दरअसल, finally में कोड और कुछ catch हैंडलर निष्पादित होंगे, लेकिन आप ThreadAbortException निगल नहीं सकते हैं।

+3

यदि मैंने इसे पोस्ट करते समय 99% नहीं किया था तो मेरा जवाब लिखना नहीं था, तो मुझे इससे परेशान नहीं होता। ThreadAbortException के बारे में अच्छी तरह से जोड़ा गया विवरण भी। – Jon

+4

यह स्वीकार क्यों नहीं किया गया है किसी का अनुमान है। –

3

Response.Redirect को एंड्रॉप्स नामक एक और पैरामीटर है। इसे गलत सेट करना एक अच्छा विचार है जब आप एक कोशिश पकड़ ब्लॉक में रीडायरेक्ट कर रहे हैं क्योंकि संदर्भ को अभी भी सही होने के लिए नियंत्रण की आवश्यकता है। तो आपका पकड़ ब्लॉक अपवाद उठाएगा।

उस पर चेतावनी यह है कि जब पृष्ठ रद्द करने योग्य नहीं होता है तो यह नियंत्रण प्राप्त करने की कोशिश नहीं करेगा। इसका सबसे आम मामला ग्लोबल.एक्सएक्स है।तो आपको उस संदर्भ में इस अपवाद के बारे में चिंता करने की आवश्यकता नहीं है। यदि आप मुझ पर विश्वास नहीं करते हैं तो इस विधि के लिए कोड को प्रतिबिंबित करने का प्रयास करें और एक नज़र डालें।

तो अपने प्रश्न का उत्तर देने के लिए प्रतिक्रिया के बाद बहुत कुछ करना आवश्यक नहीं है। रीडायरेक्ट जब आप अंत में एंड्रॉप्स को सही पर सेट करते हैं, तो यह डिफ़ॉल्ट रूप से होता है (यानी उस विधि के साथ बुलाया जाता है जो बूल नहीं लेता है)।

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