जब मैं Response.Redirect () को कॉल करता हूं तो मुझे "HTTP हेडर भेजे जाने के बाद रीडायरेक्ट नहीं किया जा सकता" क्यों मिलता है?


84

जब मैं कॉल करता Response.Redirect(someUrl)हूं तो मुझे निम्नलिखित HttpException मिलती है:

HTTP हेडर भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता है।

मुझे यह क्यों मिलता है? और मैं इस मुद्दे को कैसे ठीक कर सकता हूं?

जवाबों:


120

के लिए 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");

2
हाँ बिल्कुल। ASP.NET MVC 4 और एक्सेप्शन फिल्टर आदि के साथ यह बहुत आसानी से होता है। 301/302 जारी होने के बाद आप HTTP रिस्पांस स्टेटस कोड को भी नहीं बदल सकते।
जैन्स

मैंने अपने पृष्ठ 'स्टेटिक' पर सभी संपत्तियाँ बनाकर इस मुद्दे को सुलझाया
Sal

4
अपने गुणों को स्थिर बनाना एक खतरनाक उपाय है
भावी

जब तक कि ThreadAbortException (पहली बार से) पकड़ा न जाए, पुनर्निर्देश को दूसरी बार कैसे कहा जा सकता है? :} "रीडायरेक्ट को कॉल करना रीडायरेक्ट को दूसरे पैरामीटर ( endResponse) पर सेट के साथ सच करने के लिए कॉल करने के बराबर है।"
user2864740

1
यह अजीब है, लेकिन एक विरासत वेबफॉर्म में आवेदन Response.IsRequestBeingRedirectedझूठा है और मुझे अभी भी यही अपवाद मिल रहा है ( Application_EndRequestGlobal.asax में ईवेंट विधि के अंदर )। मैं समझ नहीं पा रहा हूं कि क्यों।
एलिसन

17

एक बार जब आप क्लाइंट को कोई भी सामग्री भेजते हैं, तो HTTP हेडर पहले ही भेजे जा चुके होते हैं। एक Response.Redirect()कॉल हेडर में विशेष जानकारी भेजकर काम करती है जो ब्राउज़र को एक अलग यूआरएल के लिए पूछती है।

चूंकि हेडर पहले ही भेजे जा चुके थे, asp.net वह नहीं कर सकता जो आप चाहते हैं (हेडर को संशोधित करें)

आप इसके द्वारा आसपास प्राप्त कर सकते हैं) या तो आप कुछ भी करने से पहले रीडायरेक्ट कर रहे हैं, या बी) Response.Buffer = trueइससे पहले कि आप कुछ और करें, यह सुनिश्चित करने के लिए कि कोई आउटपुट क्लाइंट को पूरे पेज को निष्पादित करने के लिए नहीं भेजा जाता है, का उपयोग करने का प्रयास करें।


मेरे लिए यह काम नहीं करता है। मैं .NET, MVC का उपयोग करता हूं और मेरे पास कंट्रोलर की विधि के अंदर एक कॉल है। मैं अभी भी अपवाद प्राप्त करता हूं, हालांकि पुनर्निर्देशन होता है।
FrenkyB

8

एक पुनर्निर्देशन केवल तभी हो सकता है जब एक HTTP संदेश में पहली पंक्ति " HTTP/1.x 3xx Redirect Reason" हो।

यदि आप पहले से ही Response.Write()कुछ हेडर को कॉल या सेट करते हैं, तो पुनर्निर्देशित होने में बहुत देर हो जाएगी। यदि आप Response.Headers.Clear()मदद करता है तो यह देखने के लिए आप रीडायरेक्ट से पहले कॉल करने का प्रयास कर सकते हैं।


मैं उपयोग करता हूं return RedirectToAction("Logout", "Authentication");और मुझे वह त्रुटि मिलती है
किकेनेट

जब मैंने शीर्ष लेख को साफ़ करने का प्रयास किया, तो मुझे System.PlatformNotSupportedException मिला: इस ऑपरेशन के लिए IIS एकीकृत पाइपलाइन मोड की आवश्यकता है।
आइरिश चेंज

3

बस जांचें कि क्या आपने बफरिंग विकल्प को गलत पर सेट किया है (डिफ़ॉल्ट रूप से सही है)। प्रतिक्रिया के लिए। काम करने के लिए अप्रत्यक्ष,

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

1
Response.BufferOutput = true;एक्शन में, कंट्रोलर में?
किकेनेट


2

आप नीचे दिए गए कोड का भी उपयोग कर सकते हैं

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();

1

इसके लिए एक सरल उत्तर है: आप अपना हेडर भेजने से पहले अपने पेज से कुछ और जैसे टेक्स्ट या आउटपुट से संबंधित कुछ भी आउटपुट कर रहे हैं। यह आपको उस त्रुटि के कारण प्रभावित करता है।

पॉज़िबल आउटपुट के लिए बस अपने कोड की जांच करें या आप शीर्ष लेख को अपनी विधि के ऊपर रख सकते हैं, इसलिए इसे पहले भेजा जाएगा।


1

यदि आप हेडर भेजे जाने के बाद पुनर्निर्देशित करने का प्रयास कर रहे हैं (यदि, उदाहरण के लिए, आप आंशिक रूप से जनरेट किए गए पृष्ठ से रीडायरेक्ट कर रहे हैं), तो आप कुछ क्लाइंट जावास्क्रिप्ट (स्थान .replace या location.href, आदि) भेज सकते हैं। जो भी URL आपको चाहिए उसे रीडायरेक्ट करें। बेशक, यह इस बात पर निर्भर करता है कि HTML को पहले से ही नीचे भेजा गया है।


1

"हेडर भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता" को संभालने के लिए एक्सेप्शन हैंडलर को जोड़कर मेरा मुद्दा हल हो गया। यह त्रुटि कोड के नीचे दिखाई गई है

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

1

मैंने समस्या का हल किया है: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); प्रतिक्रिया के बजाय। अप्रत्यक्ष।


1

HTTP हेडर भेजे जाने के बाद त्रुटि को पुनर्निर्देशित नहीं किया जा सकता है।

System.Web.HttpException (0x80004005): HTTP हेडर भेजे जाने के बाद पुनर्निर्देशित नहीं किया जा सकता है।

सुझाव

यदि हम asp.net mvc का उपयोग करते हैं और एक ही नियंत्रक पर काम करते हैं और अलग-अलग एक्शन पर रीडायरेक्ट करते हैं, तो आपको लिखने की आवश्यकता नहीं है ..
Response.Redirect ("ActionName", "ControllerName");
केवल
RedirectToAction ("ActionName") का उपयोग करना बेहतर है ;
या
वापसी देखें ("ViewName");


मैं किसी अन्य नियंत्रकनाम से ActionName का उपयोग करता हूं?
कीकेनेट

0

रीडायरेक्ट फ़ंक्शन संभवतः 'रिफ्रेश' http हेडर का उपयोग करके काम करता है (और शायद 30X कोड का उपयोग करके भी)। एक बार हेडर क्लाइंट को भेजे जाने के बाद, सर्वर के लिए उस रीडायरेक्ट कमांड को जोड़ने का कोई रास्ता नहीं है, यह बहुत देर हो चुकी है।


0

अगर आपको HTTP हेडर भेजे जाने के बाद Can't redirect नहीं मिलता है तो नीचे दिए गए कोड को आज़माएं।

HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);

0

सुनिश्चित करें कि आप अपने पुनर्निर्देशन से पहले की Responseतरह s 'विधियों का उपयोग नहीं करते हैं Response.Flush();


-3

इसे ठीक करने के 2 तरीके हैं:

  1. बस returnअपने बाद एक बयान जोड़ें Response.Redirect(someUrl); (यदि विधि हस्ताक्षर "शून्य" नहीं है, तो आपको उस "प्रकार" को वापस करना होगा, ज़ाहिर है:

    Response.Redirect ( "Login.aspx");

    वापसी;

नोट नोट सर्वर को रीडायरेक्ट करने की अनुमति देता है ... इसके बिना, सर्वर आपके बाकी कोड को निष्पादित करना जारी रखना चाहता है ...

  1. 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 ... कोई फर्क नहीं पड़ता न ही
Matthias बर्गर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.