为什么在我调用Response.Redirect()时收到"发送HTTP标头后无法重定向"的信息?

时间:2020-03-06 14:59:46  来源:igfitidea点击:

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

为什么我得到这个?我该如何解决这个问题?

解决方案

仅当HTTP消息中的第一行是" HTTP / 1.x 3xx重定向原因"时,才可以进行重定向。

如果我们已经调用Response.Write()或者设置了一些标头,那么进行重定向将为时已晚。我们可以尝试在重定向之前调用Response.Headers.Clear()以查看是否有帮助。

根据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属性(布尔型)。

// 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,以确保直到整个输出都没有发送到客户端页面执行完毕。

重定向功能可能通过使用" refresh" http标头(也可能使用30X代码)来工作。将标头发送到客户端后,服务器无法追加该重定向命令,为时已晚。

只需检查是否已将缓冲选项设置为false(默认情况下为true)即可​​。为了响应。重定向到工作,

  • 缓冲应为真,
  • 我们不应该使用response.write发送超过默认缓冲区大小的更多数据(在这种情况下,它将刷新自身,导致发送标头),因此不允许我们重定向。

有一个简单的答案:
在发送标题之前,我们已经输出了其他内容,例如文本或者与页面输出相关的任何东西。这影响我们得到该错误的原因。

只需检查代码以获取可能的输出,否则我们可以将标头放在方法的顶部,这样它将首先发送。

如果我们在发送标头后尝试重定向(例如,如果我们正在从部分生成的页面进行错误重定向),则可以发送一些客户端Javascript(location.replace或者location.href等)。重定向到我们想要的任何URL。当然,这取决于已经发送了哪些HTML。