当我打电话时,Response.Redirect(someUrl)
我得到以下 HttpException:
发送 HTTP 标头后无法重定向。
为什么我会得到这个?我该如何解决这个问题?
当我打电话时,Response.Redirect(someUrl)
我得到以下 HttpException:
发送 HTTP 标头后无法重定向。
为什么我会得到这个?我该如何解决这个问题?
根据 MSDN 文档Response.Redirect(string url)
,当“在发送 HTTP 标头后尝试重定向”时,它将抛出 HttpException。由于Response.Redirect(string url)
使用 Http“位置”响应标头(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 标头就已经发送。调用的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)
为我工作
您也可以使用下面提到的代码
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
对此有一个简单的答案:在发送标题之前,您已经输出了其他内容,例如文本或与页面输出相关的任何内容。这会影响您收到该错误的原因。
只需检查您的代码以获取可能的输出,或者您可以将标题放在您的方法之上,以便首先发送。
如果您在发送标头后尝试重定向(例如,如果您从部分生成的页面执行错误重定向),您可以发送一些客户端 Javascript(location.replace 或 location.href 等)重定向到您想要的任何 URL。当然,这取决于已经发送了哪些 HTML。
我的问题通过添加异常处理程序来处理“发送 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 并在同一个控制器上工作并重定向到不同的 Action 那么你不需要写..
Response.Redirect("ActionName","ControllerName");
最好只使用
return RedirectToAction("ActionName");
或
返回视图(“视图名称”);
重定向功能可能通过使用“刷新”http 标头(也可能使用 30X 代码)来工作。一旦标头已发送到客户端,服务器就无法附加该重定向命令,为时已晚。
如果您在发送 HTTP 标头后无法重定向,请尝试以下代码。
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
有两种方法可以解决此问题:
只需在您的
(如果方法签名不是“void”,您当然必须返回该“类型”)return
之后添加一条语句,如下所示:Response.Redirect(someUrl);
Response.Redirect("Login.aspx");
返回;
请注意,返回允许服务器执行重定向...没有它,服务器希望继续执行您的其余代码...
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 移动到 HERE(方法结束):
Response.Redirect(someUrl);
return;