我为什么得到"无法重新定向后HTTP头已经发送"当我呼吁的响应。Redirect()?
-
03-07-2019 - |
题
当我打电话 Response.Redirect(someUrl)
我得到HttpException:"无法重新定向后HTTP头已经发送"。
为什么我得到这个吗?和我如何能解决这个问题?
解决方案
根据 Response.Redirect(string url)
的MSDN文档,当“在发送HTTP标头后尝试重定向”时,它将抛出HttpException。由于 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标头已经发送。 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工作,
- 缓冲应该是真的,
- 你不应该使用response.write发送超过默认缓冲区大小的更多数据(在这种情况下,它会自行刷新,导致标题被发送),因此禁止你重定向。 醇>
使用
返回RedirectPermanent(myUrl)
为我工作
有一个简单的答案: 在发送标题之前,您已经输出了其他内容,例如文本或与页面输出相关的任何内容。这会影响您获得该错误的原因。
只需检查您的代码是否有可能输出,或者您可以将标题放在方法的顶部,以便首先发送。
如果您在发送标头后尝试重定向(例如,如果您从部分生成的页面执行错误重定向),则可以发送一些客户端Javascript(location.replace或location.href,等)重定向到你想要的任何URL。当然,这取决于已发送的HTML。
我的问题通过添加Exception Handler来解决 “在发送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.Flush();
之类的 Response
s方法。
您也可以使用下面提到的代码
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
错误
不向后HTTP头已经发送。
系统。网。HttpException(0x80004005):不向后HTTP头已经发送。
建议
如果我们使用asp.net 视和工作上的相同的控制器和重定向到不同的动作然后你做不需要写..
响应。Redirect("的","控制器名称");
最好只使用
回RedirectToAction("的");
或
返回查看("视图");
有两种方法可以解决这个问题:
-
只需在
Response.Redirect(someUrl);
之后添加return
语句 (如果方法签名不是“void”,则必须返回“type”,当然) 如此:的Response.Redirect(QUOT;&的Login.aspx QUOT);
返回;
醇>
- 在抛出异常的方法中创建
Response.Redirect(someUrl)
LAST执行语句。将Response.Redirect(someUrl)
替换为名为“someUrl”的字符串VARIABLE,并将其设置为重定向位置...如下所示:
醇>
注意返回允许服务器执行重定向...没有它,服务器想继续执行其余的代码......
// ......一些代码
string someUrl = String.Empty
......一些逻辑
if (x=y)
{
// comment (original location of Response.Redirect("Login.aspx");)
someUrl = "Login.aspx";
}
......更多代码
//将您的Response.Redirect移动到此处(方法结束):
Response.Redirect(someUrl);
return;