То, почему я добираюсь, “Не может перенаправить после того, как HTTP-заголовки были отправлены”, когда я называю Ответ. Перенаправление ()?

Когда я звоню Response.Redirect(someUrl) Я получаю следующий HttpException:

Не может перенаправить после того, как HTTP-заголовки были отправлены.

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

81
задан B--rian 29 October 2019 в 13:45
поделиться

7 ответов

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

Один способ принять меры против вызова Ответа. Перенаправление () многократно должно проверить 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");
116
ответ дан Samuel Meacham 24 November 2019 в 09:38
поделиться

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

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

8
ответ дан Mark Cidade 24 November 2019 в 09:38
поделиться

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

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

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

17
ответ дан mbudnik 24 November 2019 в 09:38
поделиться

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

  1. Буферизация должна быть истинной,
  2. вы не должны были отправлять больше данных, используя response.write, который превышает размер буфера по умолчанию (в этом случае он очищается сам, вызывая отправку заголовков) поэтому вам запрещено перенаправлять.
3
ответ дан 24 November 2019 в 09:38
поделиться

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

0
ответ дан 24 November 2019 в 09:38
поделиться

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

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

1
ответ дан 24 November 2019 в 09:38
поделиться

Мне нравится ответ @ Randolpho. Что касается функций, я могу привести список здесь:

Определение точки функционального программирования

, а именно

  • чистота (а.k.a. неизменяемость , устранение побочных эффектов, ссылочная прозрачность )
  • Функции высшего порядка (например, передать функцию в качестве параметра, вернуть ее в результате, определить анонимную функцию на лету как лямбда-выражение)
  • Лень (а.k.a. Нестрогая оценка , наиболее полезная/полезная при сочетании с чистотой)
  • Алгебраические типы данных и совпадение шаблонов
  • Замыкания
  • Карринг / частичное применение
  • Параметрический полиморфизм (а.к. дженерики )
  • Рекурсия (более заметная в результате чистоты)
  • Программирование с выражениями, а не операторами (опять же, из чистоты)

Чем больше конкретный язык программирования имеет синтаксис и конструкции, адаптированные к тому, чтобы сделать различные функции FP, перечисленные выше, простыми/безболезненными для выражения и реализации, тем более вероятно, кто-то будет маркировать его "функциональным языком". "

-121--1359310-

2) На данном этапе B должен объединить изменения, внесенные A, с собственными изменениями. Если они работали над различными частями кода в файле, средство управления версиями обычно может делать это автоматически. Если их изменения пересекаются, это может стать довольно одиозной задачей, но это случается редко.

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

-121--4195927-

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

1
ответ дан 24 November 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: