Почему я получаю сообщение "Не удается перенаправить после отправки заголовков HTTP", когда я вызываю Response.Redirect()?
Когда я звоню Response.Redirect(someUrl)
Я получаю HttpException: "Невозможно перенаправить после отправки заголовков HTTP".
Почему я это понимаю? И как я могу исправить эту проблему?
16 ответов
Согласно документации MSDN для Response.Redirect(string url)
, он выдаст исключение HttpException, когда "попытка перенаправления будет предпринята после отправки заголовков HTTP". поскольку Response.Redirect(string url)
использует Http-заголовок ответа "Location" ( http://en.wikipedia.org/wiki/HTTP_headers), при вызове которого заголовки будут отправлены клиенту. Это означает, что если вы вызовете его второй раз или если вы вызовете его после того, как вызвали отправку заголовков другим способом, вы получите исключение HttpException.
Один из способов избежать многократного вызова Response.Redirect() - это проверить Response.IsRequestBeingRedirected
свойство (bool) перед его вызовом.
// Causes headers to be sent to the client (Http "Location" response header)
Response.Redirect("http://www.stackru.com");
if (!Response.IsRequestBeingRedirected)
// Will not be called
Response.Redirect("http://www.google.com");
Когда вы отправляете какой-либо контент клиенту, заголовки HTTP уже отправлены. Response.Redirect()
call работает, отправляя специальную информацию в заголовках, которые заставляют браузер запрашивать другой URL.
Поскольку заголовки уже отправлены, asp.net не может делать то, что вы хотите (измените заголовки)
Вы можете обойти это путем а) либо выполнить перенаправление, прежде чем делать что-либо еще, либо б) попробовать использовать Response.Buffer = true
прежде чем делать что-либо еще, убедитесь, что клиенту не отправлены выходные данные, пока не завершится выполнение всей страницы.
Перенаправление может произойти только в том случае, если первая строка в HTTP-сообщении имеет вид "HTTP/1.x 3xx Redirect Reason
".
Если вы уже звонили Response.Write()
или установить некоторые заголовки, будет слишком поздно для перенаправления. Вы можете попробовать позвонить Response.Headers.Clear()
перед перенаправлением, чтобы увидеть, если это помогает.
Просто убедитесь, что для параметра буферизации установлено значение false (по умолчанию это значение true). Для ответа. Направить на работу,
- Буферизация должна быть правдой,
- Вы не должны были отправлять больше данных, используя response.write, который превышает размер буфера по умолчанию (в этом случае он сам очищается, вызывая отправку заголовков), поэтому запрещает перенаправление.
Вы также можете использовать приведенный ниже код
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
Моя проблема была решена путем добавления обработчика исключений для обработки "Невозможно перенаправить после отправки заголовков 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");}
Я решил проблему с помощью: Response.RedirectToRoute("CultureEnabled", RouteData.Values); вместо Response.Redirect.
Будьте уверены, что вы не используете Response
S 'методы, такие как Response.Flush();
перед вашей перенаправляющей частью.
Ошибка Невозможно перенаправить после отправки заголовков HTTP.
System.Web.HttpException (0x80004005): невозможно перенаправить после отправки заголовков HTTP.
Предложение
Если мы используем asp.net mvc и работаем на одном контроллере и перенаправляем на другое действие, то вам не нужно писать..
Response.Redirect ("ActionName", "ControllerName");
лучше использовать только
return RedirectToAction("ActionName");
или же
возврат View("ViewName");
На это есть один простой ответ: перед отправкой заголовка вы выводили что-то еще, например, текст или что-либо, связанное с выводом со своей страницы. Это влияет на то, почему вы получаете эту ошибку.
Просто проверьте ваш код на возможный вывод, или вы можете поместить заголовок поверх вашего метода, чтобы он был отправлен первым.
Если вы пытаетесь перенаправить после отправки заголовков (например, если вы делаете перенаправление ошибок с частично сгенерированной страницы), вы можете отправить некоторый клиентский Javascript (location.replace или location.href и т. Д.) перенаправить на любой URL, который вы хотите. Конечно, это зависит от того, какой HTML уже был отправлен.
Если после отправки заголовков HTTP вы получите сообщение Cannot redirect, попробуйте следующий код.
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
HttpContext.Current.Response.Redirect("/Home/Login",false);
Последний параметр, если для него установлено значение False, решает проблему, но не прекращает ответ для текущего потока.
Функция перенаправления, вероятно, работает с использованием http-заголовка "refresh" (и, возможно, также с использованием кода 30X). После того как заголовки отправлены клиенту, сервер не может добавить эту команду перенаправления, это слишком поздно.
Есть 2 способа это исправить:
Просто добавьте
return
заявление после вашегоResponse.Redirect(someUrl);
(если подпись метода не "void", вам, конечно, придется вернуть этот "тип") так:Response.Redirect ("Login.aspx");
вернуть;
Обратите внимание, что возврат позволяет серверу выполнить перенаправление... без него сервер хочет продолжить выполнение остальной части вашего кода...
- Сделай свой
Response.Redirect(someUrl)
последний выполненный оператор в методе, который вызывает исключение. Замените свойResponse.Redirect(someUrl)
со строкой VARIABLE с именем "someUrl" и установите ее в месте перенаправления... следующим образом:
//......some code
string someUrl = String.Empty
..... немного логики
if (x=y)
{
// comment (original location of Response.Redirect("Login.aspx");)
someUrl = "Login.aspx";
}
...... больше кода
// ПЕРЕМЕЩАЙТЕ ваш Response.Redirect to HERE (конец метода):
Response.Redirect(someUrl);
return;