87

当我打电话时,Response.Redirect(someUrl)我得到以下 HttpException:

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

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

4

15 回答 15

122

根据 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");
于 2008-10-01T20:25:23.097 回答
17

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

由于标头已经发送,asp.net 不能做你想做的(修改标头)

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

于 2008-10-01T20:27:04.810 回答
8

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

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

于 2008-10-01T20:24:38.293 回答
3

只需检查您是否将缓冲选项设置为 false(默认情况下为 true)。为了 response.redirect 工作,

  1. 缓冲应该是真的,
  2. 您不应该使用超过默认缓冲区大小的 response.write 发送更多数据(在这种情况下,它将自行刷新导致发送标头),因此不允许您重定向。
于 2009-05-01T09:27:54.740 回答
3

使用 return RedirectPermanent(myUrl)为我工作

于 2016-03-23T08:45:38.290 回答
2

您也可以使用下面提到的代码

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
于 2016-11-02T04:21:16.437 回答
1

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

只需检查您的代码以获取可能的输出,或者您可以将标题放在您的方法之上,以便首先发送。

于 2010-01-14T03:07:52.227 回答
1

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

于 2010-02-18T21:29:08.137 回答
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");}
于 2013-01-08T12:02:55.290 回答
1

我解决了这个问题: Response.RedirectToRoute("CultureEnabled", RouteData.Values); 而不是 Response.Redirect。

于 2015-10-31T16:43:21.973 回答
1

确保不要像在重定向部分之前那样使用Responses' 方法。Response.Flush();

于 2016-10-13T12:27:42.440 回答
1

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

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

建议

如果我们使用 asp.net mvc 并在同一个控制器上工作并重定向到不同的 Action 那么你不需要写..
Response.Redirect("ActionName","ControllerName");
最好只使用
return RedirectToAction("ActionName");

返回视图(“视图名称”);

于 2018-07-25T10:27:19.753 回答
0

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

于 2009-05-01T09:07:35.867 回答
0

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

HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
于 2015-04-01T05:16:07.533 回答
-3

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

  1. 只需在您的 (如果方法签名不是“void”,您当然必须返回该“类型”)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 移动到 HERE(方法结束):

Response.Redirect(someUrl);
return; 
于 2017-12-28T16:31:13.460 回答