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


Answers:


120

根据的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在调用属性之前检查属性(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");

2
是的。使用ASP.NET MVC 4和“异常”过滤器等,很容易发生这种情况。发出重定向301/302后,您也无法更改HTTP响应状态代码。
Jaans

我通过我的页面“静态”使所有属性解决了问题
萨尔

4
使您的属性静态化是一个危险的解决方案
探矿者

除非捕获到ThreadAbortException(从第一次),如何第二次调用重定向?:}“调用重定向等效于将第二个参数(endResponse)设置为true来调用重定向。”
user2864740 2015年

1
这很奇怪,但是在旧版Webforms应用程序中它Response.IsRequestBeingRedirected是false,并且我仍然遇到相同的异常(Application_EndRequestGlobal.asax中的内部事件方法)。我不明白为什么。
Alisson

17

将所有内容发送到客户端后,HTTP标头已经发送完毕。一个Response.Redirect()呼叫通过发送中,使浏览器请求一个不同的URL头的特殊信息。

由于标头已经发送,asp.net无法执行您想要的操作(修改标头)

您可以通过以下方法解决此问题:a)在执行其他任何操作之前执行重定向,或b)Response.Buffer = true在执行其他任何操作之前尝试使用,以确保在整个页面执行完成之前没有输出发送到客户端。


对我来说,这是行不通的。我使用.NET,MVC,并且在控制器的方法内部进行了调用。尽管发生重定向,但我仍然收到异常。
FrenkyB

8

仅当HTTP消息的第一行为“ HTTP/1.x 3xx Redirect Reason”时,才能发生重定向。

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


我使用了return RedirectToAction("Logout", "Authentication");该错误
Kiquenet

当我尝试清除标题时,出现System.PlatformNotSupportedException:此操作需要IIS集成管道模式。
IrishChieftain,

3

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

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

1
Response.BufferOutput = true;在动作中,在控制器中?
Kiquenet



1

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

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


1

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


1

通过添加异常处理程序来处理“发送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");}

1

我使用以下方法解决了该问题:Response.RedirectToRoute(“ CultureEnabled”,RouteData.Values); 而不是Response.Redirect。


1

错误 发送HTTP标头后无法重定向。

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

建议

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

返回View(“ ViewName”);


我从另一个ControllerName使用ActionName吗?
Kiquenet '19

0

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


0

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

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

0

确保在重定向部件之前不使用Responses'方法Response.Flush();


-3

有两种方法可以解决此问题:

  1. 只需return在您的后面添加一条语句Response.Redirect(someUrl); (如果方法签名不是“ void”,那么您将必须返回该“ type”),如下所示:

    Response.Redirect(“ Login.aspx”);

    返回;

请注意,返回值允许服务器执行重定向...不执行重定向,服务器希望继续执行其余代码...

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

//......some code

string someUrl = String.Empty

.....一些逻辑

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

......更多代码

//移动您的Response.Redirect到HERE(方法的结尾):

Response.Redirect(someUrl);
return; 

对不起,但这对我没有任何意义。多余的(在返回无效的方法中)应return该做什么?在return只定义,该方法结束。但是,如果没有任何代码,该方法无论如何都将完成。将url存储在变量中不会改变任何内容,我的意思是:为什么要这么做?字符串是相同的。编译后的东西在字符串和包含字符串的变量之间没有任何区别...:考虑一下x = 5,因此x为5但5也为5。即使10/2也将是5 ...两者也没有区别
Matthias Burger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.