为什么我会收到“无法重定向后HTTP标头已发送”当我打电话的Response.Redirect()?

2019-08-21 22:40发布

当我打电话Response.Redirect(someUrl)我得到一个HttpException:“之后HTTP标头已被送往不能重定向”。

为什么会这样? 我怎样才能解决这个问题?

Answer 1:

根据MSDN文档Response.Redirect(string url)它会抛出时“后的HTTP标头已发送重定向尝试”的HttpException。 由于Response.Redirect(string url)使用HTTP“位置”响应报头( 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");


Answer 2:

一旦您发送任何内容在所有客户端,HTTP标头已经发送。 一个Response.Redirect()调用的工作原理是在发送,使浏览器请求一个不同的URL头的特殊信息。

由于头也都发出去,asp.net不能做你想要的(修改标题)

您可以通过一个解决这个问题),要么做重定向你做任何事情之前,或b)使用尝试Response.Buffer = true ,你做任何事情之前,以确保直到整个页面是没有输出发送到客户端执行完毕。



Answer 3:

如果在HTTP消息中的第一行是“A重定向只能发生HTTP/1.x 3xx Redirect Reason ”。

如果你已经调用Response.Write()或设置一些标题,这将是为时已晚重定向。 你可以尝试调用Response.Headers.Clear()重定向之前,看看是否有帮助。



Answer 4:

只是检查是否已缓冲选项设置为false(默认情况下它的真实)。 对于Response.Redirect的工作,

  1. 缓冲应该是真实的,
  2. 使用的Response.Write超过默认的缓冲区大小你不应该发送更多的数据(在这种情况下,将刷新本身造成发送的报头),因此不允许你重定向。


Answer 5:

使用return RedirectPermanent(myUrl)为我工作



Answer 6:

有这一个简单的答案:你一直别的东西输出,如文本,或任何你把你的头之前从您的网页是否与输出。 这种影响为什么你的错误。

只是检查你的代码为更多钞票输出,或者你可以把标题上你的方法之上,因此将首先发送。



Answer 7:

如果您正试图重定向后的头已发送(如,比如,你正在做的错误从部分产生的重定向页面),您可以发送一些客户端的Javascript(location.replace或location.href等)重定向到任何你想要的网址。 当然,这依赖于已发送什么HTML下来。



Answer 8:

我的问题得到了通过添加异常处理程序来处理“后的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");}


Answer 9:

我解决使用问题:Response.RedirectToRoute( “CultureEnabled”,RouteData.Values); 代替的Response.Redirect。



Answer 10:

重定向功能可能是通过使用“刷新” HTTP标头(可能使用30X代码以及)的作品。 一旦头部已被发送到客户端,没有办法让服务器追加重定向命令,为时已晚。



Answer 11:

如果你得到后HTTP标头已被送往那就试试这个下面的代码不能重定向。

HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);


Answer 12:

请确保您不使用Response S'类似的方法Response.Flush(); 之前您重定向的部分。



Answer 13:

您还可以使用下面提及的代码

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();


Answer 14:

后HTTP标头已发送错误不能重定向。

System.Web.HttpException(0X80004005):HTTP标头后无法重定向已发送。

建议

如果我们使用asp.net mvc的和相同的控制器工作,并重定向到不同的行动,那么你就不需要写..
的Response.Redirect( “ActionName”, “ControllerName”);
它能够更好只使用
返回RedirectToAction( “ActionName”);
要么
返回视图(“视图名”);



Answer 15:

有两种方法来解决这个问题:

  1. 只需添加一个return语句后的Response.Redirect(someUrl); (如果方法签名不是“无效的”,你将不得不返回“类型”,当然)像这样:

    的Response.Redirect( “的Login.aspx”);

    返回;

注意返回允许服务器没有它执行重定向...,服务器需要继续执行您的代码的其余部分...

  1. 让你Response.Redirect(someUrl)在抛出异常的方法,最后执行的语句。 更换你Response.Redirect(someUrl)与名为“someUrl”字符串变量,并将其设置为重定向位置...如下:

//......some code

string someUrl = String.Empty

.....一些逻辑

if (x=y)
{
    // comment (original location of Response.Redirect("Login.aspx");)
    someUrl = "Login.aspx";
}

......更多的代码

//移动你的Response.Redirect到这里(该方法的末尾):

Response.Redirect(someUrl);
return; 


文章来源: Why do I get “Cannot redirect after HTTP headers have been sent” when I call Response.Redirect()?