Почему я получаю "не удается перенаправить после HTTP заголовки были отправлены", когда я вызываю ответ.Редирект ()?



когда я называю Response.Redirect(someUrl) Я получаю HttpException:"не удается перенаправить после отправки заголовков HTTP".



почему я получаю это? И как я могу исправить эту проблему?

947   15  

15 ответов:

согласно документации MSDN для Response.Redirect(string url), он вызовет HttpException, когда"перенаправление будет предпринято после отправки заголовков HTTP". Так как Response.Redirect(string url) использует заголовок ответа Http "Location" (http://en.wikipedia.org/wiki/HTTP_headers#Responses), вызов его вызовет заголовки будут отправлены клиенту. Это означает, что если вы вызываете его во второй раз, или если вы вызываете его после того, как вы заставили заголовки быть отправлены каким-то другим способом, вы получите HttpException.

один из способов защиты от вызова ответа.Redirect () несколько раз, чтобы проверить Response.IsRequestBeingRedirected свойство (bool) перед вызовом его.

// 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() до переадресации, чтобы увидеть, если это помогает.

просто проверьте, если вы установили параметр буферизации false (по умолчанию его true). По реагированию.перенаправление на работу,

  1. буферизация должна быть истинной,
  2. - вы не должны были отправить больше данных с помощью ответ.запись, которая превышает размер буфера по умолчанию (в этом случае он будет очищать себя, вызывая отправку заголовков), поэтому запрещает вам перенаправлять.

используя return RedirectPermanent(myUrl) работал для меня

есть один простой ответ на этот: Вы выводили что-то еще, например текст, или что-то связанное с выводом с вашей страницы, прежде чем отправлять свой заголовок. Это влияет на то, почему вы получаете эту ошибку.

просто проверьте свой код для возможного вывода или вы можете поместить заголовок поверх своего метода, чтобы он был отправлен первым.

Если вы пытаетесь перенаправить после отправки заголовков (если, например, вы делаете перенаправление ошибки с частично сгенерированной страницы), вы можете отправить некоторый клиент Javascript (location.замена или расположение.href, etc.) для перенаправления на любой 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");}

Я решил проблему с помощью: Ответ.RedirectToRoute ("CultureEnabled", RouteData.Ценности); Вместо ответа.Перенаправлять.

функция перенаправления, вероятно, работает с помощью заголовка http 'refresh' (и, возможно, с использованием кода 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.

есть 2 способа исправить это:

  1. добавить return заявление после Response.Redirect(someUrl); ( если сигнатура метода не является "void", вам придется вернуть этот "тип", конечно ) как так:

    ответ.Перенаправление("Логин.aspx");

    возврат;

Примечание возврат позволяет серверу выполнить перенаправление...без него сервер хочет продолжить выполнение остальной части вашего код...

  1. сделать свой Response.Redirect(someUrl) последний выполненный оператор в методе, который вызывает исключение. Заменить Response.Redirect(someUrl) со строковой переменной с именем "someUrl", и установите его в расположение перенаправления... следующим образом:

//......some code

string someUrl = String.Empty

.....какая-то логика

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

......больше кода

/ / переместите свой ответ.Перенаправление сюда (конец метода):

Response.Redirect(someUrl);
return; 

Comments

    Ничего не найдено.