Почему при вызове Response.Redirect () появляется сообщение «Невозможно перенаправить после отправки заголовков HTTP»? - PullRequest
81 голосов
/ 02 октября 2008

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

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

Ответы [ 15 ]

116 голосов
/ 02 октября 2008

В соответствии с документацией 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");
17 голосов
/ 02 октября 2008

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

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

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

8 голосов
/ 02 октября 2008

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

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

3 голосов
/ 01 мая 2009

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

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

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

1 голос
/ 31 октября 2015

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

1 голос
/ 08 января 2013

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

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

1 голос
/ 14 января 2010

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

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

0 голосов
/ 25 июля 2018

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

System.Web.HttpException (0x80004005): невозможно перенаправить после отправки заголовков HTTP.

Предложение

Если мы используем asp.net mvc и работаем на одном контроллере и перенаправляем на другое действие, вам не нужно писать ..
Response.Redirect ("ActionName", "ControllerName");
лучше использовать только
return RedirectToAction ("ActionName");
или
return View ("ViewName");

...