为什么我在调用Response.Redirect()时得到“在发送HTTP头之后无法redirect”?
当我调用Response.Redirect(someUrl)
我得到一个HttpException:“发送HTTP标头后不能redirect”。
我为什么得到这个? 我该如何解决这个问题?
根据Response.Redirect(string url)
的MSDN文档,当“HTTP头被发送后尝试redirect”时,它将抛出HttpExceptionexception。 由于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)在做任何事情之前做redirect,或者b)在做任何事情之前尝试使用Response.Buffer = true
,以确保在整个页面之前没有任何输出被发送到客户端完成执行。
如果HTTP消息中的第一行是“ HTTP/1.x 3xx Redirect Reason
”,则只能发生HTTP/1.x 3xx Redirect Reason
。
如果您已经调用了Response.Write()
或设置了一些标题,那么redirect就太迟了。 您可以尝试在redirect之前调用Response.Headers.Clear()
以查看是否有帮助。
只要检查你是否已经将缓冲选项设置为false(默认为true)。 为了response.redirect工作,
- 缓冲应该是真实的,
- 你不应该使用超过默认缓冲区大小的response.write发送更多的数据(在这种情况下,它会刷新本身,导致头文件被发送),因此不允许你redirect。
使用return RedirectPermanent(myUrl)
为我工作
对此有一个简单的答案:在发送标题之前,您已经输出了其他内容,如文本或任何与页面输出相关的内容。 这会影响你为什么得到这个错误。
只需检查您的代码是否可输出,或者您可以将标题放在方法的顶部,以便首先发送。
我的问题通过添加exception处理程序来处理“不能redirectHTTP头后发送”解决。 如下代码所示的这个错误
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。
redirectfunction可能通过使用“刷新”http头(也可能使用30X代码)。 一旦头被发送到客户端,服务器没有办法追加这个redirect命令,太迟了。
如果您在发送头文件后尝试redirect(例如,如果您正在从部分生成的页面进行错误redirect),则可以发送一些客户端Javascript(location.replace或location.href等)redirect到你想要的任何URL。 当然,这取决于已经发送的HTML。
如果你得到HTTP头后,不能redirect,然后尝试下面的代码。
HttpContext.Current.Server.ClearError(); // Response.Headers.Clear(); HttpContext.Current.Response.Redirect("/Home/Login",false);
确保你不使用Response.Flush();
在redirect部分之前。
你也可以使用下面提到的代码
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();