当我调用Response.Redirect()时,为什么会在"发送HTTP标头后无法重定向"?

Sam*_*ham 81 asp.net response.redirect httpexception http-headers

当我调用时,Response.Redirect(someUrl)我得到一个HttpException:"在发送HTTP头之后无法重定向".

为什么我这样做?我该如何解决这个问题?

Sam*_*ham 116

根据MSDN文档Response.Redirect(string url),当"在发送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");
Run Code Online (Sandbox Code Playgroud)

  • 使您的属性静态是一个危险的解决方案 (4认同)
  • 这很奇怪,但在旧版 webforms 应用程序中,“Response.IsRequestBeingRedirected”是假的,我仍然遇到同样的异常(在 Global.asax 中的“Application_EndRequest”事件方法中)。我不明白为什么。 (3认同)
  • 没错。这在 ASP.NET MVC 4 和异常过滤器等中很容易发生。一旦发出重定向 301/302,您也无法更改 HTTP 响应状态代码。 (2认同)

Phi*_*eck 17

一旦您将任何内容发送到客户端,HTTP标头就已经发送过了.一个Response.Redirect()呼叫通过发送中,使浏览器请求一个不同的URL头的特殊信息.

由于标题已经发送,asp.net无法做你想要的(修改标题)

您可以通过以下方式来解决这个问题:a)在执行任何其他操作之前执行重定向,或者b)Response.Buffer = true在执行任何其他操作之前尝试使用,以确保在整个页面执行完毕之前不会向客户端发送任何输出.


Mar*_*ade 8

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

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