当我打电话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
调用前财产(布尔)。
// 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不能做你想要的(修改标题)
您可以通过一个解决这个问题),要么做重定向你做任何事情之前,或b)使用尝试Response.Buffer = true
,你做任何事情之前,以确保直到整个页面是没有输出发送到客户端执行完毕。
如果在HTTP消息中的第一行是“A重定向只能发生HTTP/1.x 3xx Redirect Reason
”。
如果你已经调用Response.Write()
或设置一些标题,这将是为时已晚重定向。 你可以尝试调用Response.Headers.Clear()
重定向之前,看看是否有帮助。
只是检查是否已缓冲选项设置为false(默认情况下它的真实)。 对于Response.Redirect的工作,
使用return RedirectPermanent(myUrl)
为我工作
有这一个简单的答案:你一直别的东西输出,如文本,或任何你把你的头之前从您的网页是否与输出。 这种影响为什么你的错误。
只是检查你的代码为更多钞票输出,或者你可以把标题上你的方法之上,因此将首先发送。
如果您正试图重定向后的头已发送(如,比如,你正在做的错误从部分产生的重定向页面),您可以发送一些客户端的Javascript(location.replace或location.href等)重定向到任何你想要的网址。 当然,这依赖于已发送什么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。
重定向功能可能是通过使用“刷新” HTTP标头(可能使用30X代码以及)的作品。 一旦头部已被发送到客户端,没有办法让服务器追加重定向命令,为时已晚。
如果你得到后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();
后HTTP标头已发送错误不能重定向。
System.Web.HttpException(0X80004005):HTTP标头后无法重定向已发送。
建议
如果我们使用asp.net mvc的和相同的控制器工作,并重定向到不同的行动,那么你就不需要写..
的Response.Redirect( “ActionName”, “ControllerName”);
它能够更好只使用
返回RedirectToAction( “ActionName”);
要么
返回视图(“视图名”);
有两种方法来解决这个问题:
只需添加一个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到这里(该方法的末尾):
Response.Redirect(someUrl);
return;