Когда я вызываю Response.Redirect(someUrl)
, я получаю HttpException: "Невозможно перенаправить после отправки HTTP-заголовков".
Почему я это получаю? И как я могу исправить эту проблему?
Когда я вызываю 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.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");
Как только вы отправляете какой-либо контент клиенту, HTTP-заголовки уже отправлены. A Response.Redirect()
работает, отправляя специальную информацию в заголовках, которые заставляют браузер запрашивать другой URL-адрес.
Поскольку заголовки уже отправлены, asp.net не может делать то, что вы хотите (изменить заголовки)
Вы можете обойти это: a) либо выполнить перенаправление, прежде чем делать что-либо еще, либо b) попробовать использовать Response.Buffer = true
, прежде чем делать что-либо еще, чтобы убедиться, что на клиент не отправляется вывод до полной страницы выполняется.
Переадресация возможна только в том случае, если первая строка в HTTP-сообщении "HTTP/1.x 3xx Redirect Reason
".
Если вы уже вызвали Response.Write()
или задали некоторые заголовки, будет слишком поздно для перенаправления. Вы можете попробовать позвонить Response.Headers.Clear()
перед перенаправлением, чтобы узнать, помогает ли это.
Просто проверьте, установлен ли параметр буферизации на значение false (по умолчанию это значение true). Для response.redirect для работы,
Использование
return RedirectPermanent(myUrl)
работал у меня
Для этого есть один простой ответ: Перед отправкой заголовка вы выводили что-то еще, например текст или что-либо, связанное с выходом с вашей страницы. Это влияет на то, почему вы получаете эту ошибку.
Просто проверьте свой код на возможный вывод или вы можете поместить заголовок поверх своего метода, чтобы он был первым.
Моя проблема была решена путем добавления обработчика исключений для обработки "Невозможно перенаправить после отправки 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.
Функция перенаправления, вероятно, работает с использованием заголовка http 'refresh' (и, возможно, с использованием кода 30X). После того, как заголовки отправлены клиенту, сервер не может добавить эту команду перенаправления, слишком поздно.
Если вы пытаетесь перенаправить после отправки заголовков (если, например, вы выполняете переадресацию ошибок с частично сгенерированной страницы), вы можете отправить некоторый клиентский Javascript (location.replace или location.href, и т.д.) для перенаправления на любой URL-адрес, который вы хотите. Конечно, это зависит от того, какой HTML уже отправлен.
Если вы получаете Не удается перенаправить после отправки HTTP-заголовков, попробуйте этот ниже код.
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
Убедитесь, что перед своей перенаправляющей частью вы не используете методы Response
s ', такие как Response.Flush();
.
Вы также можете использовать приведенный ниже код
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();