لماذا تظهر لي رسالة "لا يمكن إعادة التوجيه بعد إرسال رؤوس HTTP" عندما أقوم بالاتصال بـ Response.Redirect()؟

StackOverflow https://stackoverflow.com/questions/159523

سؤال

عندما أتصل Response.Redirect(someUrl) أحصل على HttpException:"لا يمكن إعادة التوجيه بعد إرسال رؤوس HTTP".

لماذا أحصل على هذا؟وكيف يمكنني إصلاح هذه المشكلة؟

هل كانت مفيدة؟

المحلول

واستنادا إلى وثائق MSDN لResponse.Redirect(string url)، فإنه سيتم رمي HttpException عندما "تتم محاولة إعادة توجيه بعد أن تم إرسال رؤوس HTTP". منذ Response.Redirect(string url) يستخدم المتشعب "الموقع" رأس استجابة ( http://en.wikipedia.org/wiki/ HTTP_headers # الردود )، واصفا ذلك سيكون سببا في رؤوس ليتم إرسالها إلى العميل. وهذا يعني أنه إذا كنت اسميها مرة ثانية، أو إذا كنت أسميها بعد أن كنت قد تسببت في رؤوس ليتم إرسالها بطريقة أخرى، ستحصل على HttpException.

وطريقة واحدة للوقاية من الدعوة Response.Redirect () عدة مرات للتحقق من الملكية 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");

نصائح أخرى

وعندما ترسل أي محتوى على الإطلاق إلى العميل، وقد تم بالفعل أرسلت رؤوس HTTP. دعوة Response.Redirect() يعمل عن طريق إرسال المعلومات الخاصة في الرؤوس التي تجعل المتصفح نسأل لURL مختلفة.

ومنذ أن أرسلت رؤوس بالفعل، asp.net لا تستطيع أن تفعل ما تريد (تعديل رؤوس)

ويمكنك الحصول على حول هذا عن طريق أ) إما القيام إعادة توجيه قبل أن تفعل أي شيء آخر، أو ب) حاول استخدام Response.Buffer = true قبل أن تفعل أي شيء آخر، للتأكد من أن أي نتيجة يتم إرسالها إلى العميل حتى يتم صفحة كاملة تنفيذ.

وإعادة توجيه يمكن أن يحدث إلا إذا كان السطر الأول في رسالة HTTP هو "HTTP/1.x 3xx Redirect Reason".

إذا دعت بالفعل Response.Write() أو تعيين بعض الرؤوس، فإنه سوف يكون قد فات الأوان لإعادة التوجيه. يمكنك محاولة الدعوة Response.Headers.Clear() قبل إعادة توجيه لمعرفة ما اذا كان ذلك يساعد.

فقط تحقق مما إذا كنت قد قمت بتعيين خيار التخزين المؤقت على خطأ (افتراضيًا يكون صحيحًا).للاستجابة. إعادة التوجيه إلى العمل،

  1. يجب أن يكون التخزين المؤقت صحيحًا،
  2. لا يجب أن ترسل المزيد من البيانات باستخدام Response.write الذي يتجاوز حجم المخزن المؤقت الافتراضي (وفي هذه الحالة سوف يتدفق تلقائيًا مما يتسبب في إرسال الرؤوس) وبالتالي لا يسمح لك بإعادة التوجيه.

وعن طريق عملت return RedirectPermanent(myUrl) بالنسبة لي

وهناك إجابة واحدة بسيطة لذلك: لقد كان شيئا إخراج آخر، مثل النص، أو أي شيء متعلق الإخراج من صفحتك قبل إرسال رأس الخاصة بك. يؤثر هذا على ماذا تحصل على هذا الخطأ.

وانظروا فقط التعليمات البرمجية للإخراج POSIBLE أو يمكنك وضع الرأس على أعلى طريقتك لذلك سوف يتم إرسال أولا.

إذا كنت تحاول إعادة توجيه بعد أن تم إرسال الرؤوس (إذا، على سبيل المثال، تقومون به خطأ توجيه من صفحة ولدت جزئيا)، يمكنك إرسال بعض العملاء جافا سكريبت (location.replace أو location.href، الخ) لإعادة توجيه إلى أي URL تريد. وبطبيعة الحال، وهذا يتوقف على ما HTML سبق أن أنزل.

وبلدي العدد حصلت على حلها عن طريق إضافة معالج استثناء لمعالجة "لا يمكن إعادة توجيه بعد رؤوس HTTP تم إرسالها". هذا خطأ كما هو مبين أدناه كود

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

وأنا حل المشكلة باستخدام: Response.RedirectToRoute ( "CultureEnabled"، RouteData.Values)؛ بدلا من Response.Redirect.

وظيفة إعادة توجيه ربما يعمل عن طريق استخدام 'تحديث' رأس HTTP (وربما باستخدام رمز 30X كذلك). مرة واحدة وقد تم إرسال الرؤوس إلى العميل، ليس هناك طريقة للملقم لإلحاق هذا الأمر إعادة توجيه، في وقت متأخر جدا.

إذا تحصل لا يمكن إعادة توجيه بعد إرسال رؤوس HTTP ثم حاول هذا رمز أدناه.

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

وتأكد من أنك لا تستخدم أساليب Responses 'مثل Response.Flush(); قبل جزء إعادة توجيه الخاص بك.

يمكنك أيضا استخدام التعليمات البرمجية المذكورة أدناه

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

خطألا يمكن إعادة التوجيه بعد إرسال رؤوس HTTP.

System.Web.HttpException (0x80004005):لا يمكن إعادة التوجيه بعد إرسال رؤوس HTTP.

اقتراح

إذا استخدمنا asp.net mvc ونعمل على نفس وحدة التحكم وأعدنا التوجيه إلى إجراء مختلف فلن تحتاج إلى الكتابة..
Response.Redirect("ActionName"،"ControllerName")؛
من الأفضل استخدامه فقط
return RedirectToAction("ActionName");
أو
إرجاع العرض("اسم العرض");

هناك طريقتان لإصلاح هذا:

  1. فقط أضف أ return بيان بعد الخاص بك Response.Redirect(someUrl);(إذا لم يكن توقيع الطريقة "باطلاً" ، فسيتعين عليك إرجاع هذا "النوع" ، بالطبع) على النحو التالي:

    Response.Redirect("Login.aspx");

    يعود؛

لاحظ أن الإرجاع يسمح للخادم بإجراء إعادة التوجيه... وبدون ذلك، يريد الخادم مواصلة تنفيذ بقية التعليمات البرمجية الخاصة بك...

  1. اصنع لك Response.Redirect(someUrl) آخر عبارة تم تنفيذها في الطريقة التي تطرح الاستثناء.استبدل الخاص بك Response.Redirect(someUrl) باستخدام سلسلة VARIABLE تسمى "someUrl"، وقم بتعيينها على موقع إعادة التوجيه...على النحو التالي:

//......some code

string someUrl = String.Empty

..... بعض المنطق

if (x=y)
{
    // comment (original location of Response.Redirect("Login.aspx");)
    someUrl = "Login.aspx";
}

......المزيد من الكود

// انقل Response.Redirect إلى هنا (نهاية الطريقة):

Response.Redirect(someUrl);
return; 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top