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

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

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

Ответ 1

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

Один из способов защитить от вызова Response.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");

Ответ 2

Как только вы отправляете какой-либо контент клиенту, HTTP-заголовки уже отправлены. A Response.Redirect() работает, отправляя специальную информацию в заголовках, которые заставляют браузер запрашивать другой URL-адрес.

Поскольку заголовки уже отправлены, asp.net не может делать то, что вы хотите (изменить заголовки)

Вы можете обойти это: a) либо выполнить перенаправление, прежде чем делать что-либо еще, либо b) попробовать использовать Response.Buffer = true, прежде чем делать что-либо еще, чтобы убедиться, что на клиент не отправляется вывод до полной страницы выполняется.

Ответ 3

Переадресация возможна только в том случае, если первая строка в HTTP-сообщении "HTTP/1.x 3xx Redirect Reason".

Если вы уже вызвали Response.Write() или задали некоторые заголовки, будет слишком поздно для перенаправления. Вы можете попробовать позвонить Response.Headers.Clear() перед перенаправлением, чтобы узнать, помогает ли это.

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Моя проблема была решена путем добавления обработчика исключений для обработки "Невозможно перенаправить после отправки 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");}

Ответ 8

Я решил проблему, используя: Response.RedirectToRoute( "CultureEnabled", RouteData.Values); вместо Response.Redirect.

Ответ 9

Функция перенаправления, вероятно, работает с использованием заголовка http 'refresh' (и, возможно, с использованием кода 30X). После того, как заголовки отправлены клиенту, сервер не может добавить эту команду перенаправления, слишком поздно.

Ответ 10

Если вы пытаетесь перенаправить после отправки заголовков (если, например, вы выполняете переадресацию ошибок с частично сгенерированной страницы), вы можете отправить некоторый клиентский Javascript (location.replace или location.href, и т.д.) для перенаправления на любой URL-адрес, который вы хотите. Конечно, это зависит от того, какой HTML уже отправлен.

Ответ 11

Если вы получаете Не удается перенаправить после отправки HTTP-заголовков, попробуйте этот ниже код.

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

Ответ 12

Убедитесь, что перед своей перенаправляющей частью вы не используете методы Response s ', такие как Response.Flush();.

Ответ 13

Вы также можете использовать приведенный ниже код

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