Почему я получаю сообщение “Невозможно перенаправить после отправки 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 "Location" (Местоположение) (http://en.wikipedia.org/wiki/HTTP_headers#Responses), его вызов приведет к отправке заголовков клиенту.Это означает, что если вы вызовете его во второй раз или если вы вызовете его после того, как вы вызвали отправку заголовков каким-либо другим способом, вы получите исключение HttpException.

Один из способов защититься от вызова Response.Многократное перенаправление () - это проверить 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-заголовки уже отправлены.A Response.Redirect() call работает путем отправки специальной информации в заголовках, которые заставляют браузер запрашивать другой URL.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Убедитесь, что вы не используете Responseтакие методы, как 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 и работаем на одном контроллере и перенаправляем на разные действия, тогда вам не нужно писать..
Ответ.Перенаправление ("ActionName","controllerName");
его лучше использовать только
возвращает RedirectToAction("Имя действия");
или
вернуть вид ("Имя вида");

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

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

    Ответ.Перенаправление ("Login.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; 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top