http-headers - 在发送了HTTP标头之后,"当我调用 Response.Redirect() 时,ASP.NET 为什么要"无法重定向?

  显示原文与译文双语对照的内容

当我调用 Response.Redirect(someUrl) 时,得到一个 HttpException: "邮件头已经发送"无法重定向"。

我为什么要? 我如何解决这个问题?

时间:

根据 Response.Redirect(string url)的MSDN文档,在"在发送HTTP标头后尝试重新定向"时它将抛出一个 HttpException 。 由于 Response.Redirect(string url) 使用 Http"位置"响应头( http://en.wikipedia.org/wiki/HTTP_headers#Responses ),调用它将导致邮件头发送到客户端。 这意味着如果你再次调用它,或者在引发了一些它的他方式后调用它,则将获得 tmodel 。

防止调用 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 无法执行你所需的操作( 修改标题)

在完成其他任何操作之前,你都可以绕过它。在执行其他任何操作之前尝试使用 Response.Buffer = true,以确保在整个页面执行完之前不向客户端发送输出。

只有在HTTP消息中的第一行出现时才会发生重定向" HTTP/1.x 3xx Redirect Reason

如果你已经调用 Response.Write() 或者设置了一些头,那么重定向就太晚了。 你可以在重定向之前尝试调用 Response.Headers.Clear(),以查看是否有帮助。

检查是否已经将缓冲选项设置为 false ( 默认情况下它的true ) 。 为了让 response.redirect 工作

  • 缓冲应该是 true,
  • 你不应该使用 response.write 发送超过默认缓冲区大小( 在这种情况下它会自行刷新,导致邮件头被发送)的更多数据,因此不允许你重定向。

这里有一个简单的答案: 在发送页眉之前,你已经输出了它的他内容,比如文本或者与页面输出相关的任何内容。 这会影响到你为什么会。

只要检查你的posible输出代码,或者你可以将标题放在你的方法上,这样它就会首先发送。

我的问题通过添加异常处理程序来处理"。在发送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 码) 来工作。 一旦邮件头被发送到客户端,服务器没有办法追加该重定向命令,它太晚了。

如果在发送邮件头之后试图重定向,可以发送一些客户端Javascript重定向到你想要的任何 URL 。 当然,这取决于哪些HTML已经被发送了。

如果在发送HTTP标头后无法重定向,请尝试以下代码。


HttpContext.Current.Server.ClearError();


//Response.Headers.Clear();


HttpContext.Current.Response.Redirect("/Home/Login",false);



...