जब मैं कॉल करता Response.Redirect(someUrl)
हूं तो मुझे निम्नलिखित HttpException मिलती है:
HTTP हेडर भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता है।
मुझे यह क्यों मिलता है? और मैं इस मुद्दे को कैसे ठीक कर सकता हूं?
जब मैं कॉल करता Response.Redirect(someUrl)
हूं तो मुझे निम्नलिखित HttpException मिलती है:
HTTP हेडर भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता है।
मुझे यह क्यों मिलता है? और मैं इस मुद्दे को कैसे ठीक कर सकता हूं?
जवाबों:
के लिए MSDN प्रलेखन के अनुसार Response.Redirect(string url)
, यह एक HttpException फेंक देगा जब "HTTP हेडर भेजे जाने के बाद पुनर्निर्देशन का प्रयास किया जाता है"। चूंकि Response.Redirect(string url)
Http "स्थान" प्रतिक्रिया शीर्ष लेख ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ) का उपयोग करता है, इसलिए यह कॉल करने से हेडर क्लाइंट को भेजा जाएगा। इसका मतलब यह है कि यदि आप इसे दूसरी बार कहते हैं, या यदि आप हेडर को किसी अन्य तरीके से भेजे जाने के कारण कहते हैं, तो आप इसे HttpException प्राप्त करेंगे।
कॉल करने के लिए प्रतिसाद देने का एक तरीका। प्रतिक्रिया () कई बार Response.IsRequestBeingRedirected
कॉल करने से पहले संपत्ति (बूल) की जांच करना है।
// Causes headers to be sent to the client (Http "Location" response header)
Response.Redirect("http://www.stackoverflow.com");
if (!Response.IsRequestBeingRedirected)
// Will not be called
Response.Redirect("http://www.google.com");
endResponse
) पर सेट के साथ सच करने के लिए कॉल करने के बराबर है।"
Response.IsRequestBeingRedirected
झूठा है और मुझे अभी भी यही अपवाद मिल रहा है ( Application_EndRequest
Global.asax में ईवेंट विधि के अंदर )। मैं समझ नहीं पा रहा हूं कि क्यों।
एक बार जब आप क्लाइंट को कोई भी सामग्री भेजते हैं, तो HTTP हेडर पहले ही भेजे जा चुके होते हैं। एक Response.Redirect()
कॉल हेडर में विशेष जानकारी भेजकर काम करती है जो ब्राउज़र को एक अलग यूआरएल के लिए पूछती है।
चूंकि हेडर पहले ही भेजे जा चुके थे, asp.net वह नहीं कर सकता जो आप चाहते हैं (हेडर को संशोधित करें)
आप इसके द्वारा आसपास प्राप्त कर सकते हैं) या तो आप कुछ भी करने से पहले रीडायरेक्ट कर रहे हैं, या बी) Response.Buffer = true
इससे पहले कि आप कुछ और करें, यह सुनिश्चित करने के लिए कि कोई आउटपुट क्लाइंट को पूरे पेज को निष्पादित करने के लिए नहीं भेजा जाता है, का उपयोग करने का प्रयास करें।
एक पुनर्निर्देशन केवल तभी हो सकता है जब एक HTTP संदेश में पहली पंक्ति " HTTP/1.x 3xx Redirect Reason
" हो।
यदि आप पहले से ही Response.Write()
कुछ हेडर को कॉल या सेट करते हैं, तो पुनर्निर्देशित होने में बहुत देर हो जाएगी। यदि आप Response.Headers.Clear()
मदद करता है तो यह देखने के लिए आप रीडायरेक्ट से पहले कॉल करने का प्रयास कर सकते हैं।
return RedirectToAction("Logout", "Authentication");
और मुझे वह त्रुटि मिलती है
बस जांचें कि क्या आपने बफरिंग विकल्प को गलत पर सेट किया है (डिफ़ॉल्ट रूप से सही है)। प्रतिक्रिया के लिए। काम करने के लिए अप्रत्यक्ष,
Response.BufferOutput = true;
एक्शन में, कंट्रोलर में?
आप नीचे दिए गए कोड का भी उपयोग कर सकते हैं
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
इसके लिए एक सरल उत्तर है: आप अपना हेडर भेजने से पहले अपने पेज से कुछ और जैसे टेक्स्ट या आउटपुट से संबंधित कुछ भी आउटपुट कर रहे हैं। यह आपको उस त्रुटि के कारण प्रभावित करता है।
पॉज़िबल आउटपुट के लिए बस अपने कोड की जांच करें या आप शीर्ष लेख को अपनी विधि के ऊपर रख सकते हैं, इसलिए इसे पहले भेजा जाएगा।
यदि आप हेडर भेजे जाने के बाद पुनर्निर्देशित करने का प्रयास कर रहे हैं (यदि, उदाहरण के लिए, आप आंशिक रूप से जनरेट किए गए पृष्ठ से रीडायरेक्ट कर रहे हैं), तो आप कुछ क्लाइंट जावास्क्रिप्ट (स्थान .replace या location.href, आदि) भेज सकते हैं। जो भी URL आपको चाहिए उसे रीडायरेक्ट करें। बेशक, यह इस बात पर निर्भर करता है कि HTML को पहले से ही नीचे भेजा गया है।
"हेडर भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता" को संभालने के लिए एक्सेप्शन हैंडलर को जोड़कर मेरा मुद्दा हल हो गया। यह त्रुटि कोड के नीचे दिखाई गई है
catch (System.Threading.ThreadAbortException)
{
// To Handle HTTP Exception "Cannot redirect after HTTP headers have been sent".
}
catch (Exception e)
{//Here you can put your context.response.redirect("page.aspx");}
HTTP हेडर भेजे जाने के बाद त्रुटि को पुनर्निर्देशित नहीं किया जा सकता है।
System.Web.HttpException (0x80004005): HTTP हेडर भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता है।
सुझाव
यदि हम asp.net mvc का उपयोग करते हैं और एक ही नियंत्रक पर काम करते हैं और अलग-अलग एक्शन पर रीडायरेक्ट करते हैं, तो आपको लिखने की आवश्यकता नहीं है ..
Response.Redirect ("ActionName", "ControllerName");
केवल
RedirectToAction ("ActionName") का उपयोग करना बेहतर है ;
या
वापसी देखें ("ViewName");
इसे ठीक करने के 2 तरीके हैं:
बस return
अपने बाद एक बयान जोड़ें Response.Redirect(someUrl);
(यदि विधि हस्ताक्षर "शून्य" नहीं है, तो आपको उस "प्रकार" को वापस करना होगा, ज़ाहिर है:
Response.Redirect ( "Login.aspx");
वापसी;
नोट नोट सर्वर को रीडायरेक्ट करने की अनुमति देता है ... इसके बिना, सर्वर आपके बाकी कोड को निष्पादित करना जारी रखना चाहता है ...
Response.Redirect(someUrl)
अपवाद को फेंकने की विधि में अपना अंतिम निष्पादित विवरण बनाएं । Response.Redirect(someUrl)
"SomeUrl" नामक एक स्ट्रिंग VARIABLE के साथ अपना स्थान बदलें , और इसे पुन: निर्देशित स्थान पर सेट करें ... निम्नानुसार://......some code
string someUrl = String.Empty
..... कुछ तर्क
if (x=y)
{
// comment (original location of Response.Redirect("Login.aspx");)
someUrl = "Login.aspx";
}
...... अधिक कोड
// अपनी प्रतिक्रिया दें। HERE पर अप्रत्यक्ष करें (विधि का अंत):
Response.Redirect(someUrl);
return;
return
है? return
केवल परिभाषित करता है कि विधि पूरा हो गया है। लेकिन जब कोई कोड शेष नहीं रहता है, तो विधि वैसे भी पूरी हो जाती है। और एक चर में एक url भंडारण कुछ भी नहीं बदलता है, मेरा मतलब है: यह क्यों होना चाहिए? स्ट्रिंग एक ही है। संकलित चीज़ एक स्ट्रिंग और एक चर वाले चर के बीच कोई अंतर नहीं करती है ...: के बारे में सोचो x = 5
, तो x 5 है, लेकिन 5 भी 5 है। यहां तक कि 10/2 होगा 5 ... कोई फर्क नहीं पड़ता न ही