为什么在我调用Response.Redirect()时收到"发送HTTP标头后无法重定向"的信息?
当我调用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。