【问题标题】:Server Cannot Append Header After HTTP headers have been sent Exception at @Html.AntiForgery发送 HTTP 标头后服务器无法附加标头 @Html.AntiForgery 出现异常
【发布时间】:2016-03-20 02:53:07
【问题描述】:

我正在开发一个 asp.net mvc 5 应用程序,我试图通过应用以下代码重定向到 ReturnUrl:

[HttpPost]
[AllowAnonymous]
public ActionResult Login(UserLogin model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        string EncryptedPassword = GetMD5(model.Password);
        if (DataAccess.DAL.UserIsValid(model.Username, EncryptedPassword))
        {
            FormsAuthentication.SetAuthCookie(model.Username, true);
            if (String.IsNullOrEmpty(returnUrl))
            {
                return RedirectToAction("Index", "Home");
            }
            else
            {
                Response.Redirect(returnUrl);
            }
        }
        else
        {
            ModelState.AddModelError("", "Invalid Username or Password");
        }
    }
    return View();
}

上面的代码工作正常,但问题是当我发布登录表单时,它给了我一个我以前从未遇到过的异常,我在解决视图中生成的异常时遇到了困难Login.cshtml,在线:

@Html.AntiForgeryToken()

以及它抛出的异常:

发送 HTTP 标头后,服务器无法附加标头。

我研究了很多,但我无法得出结论。当我删除 @Html.AntiForgeryToken() 行时,我的应用程序工作正常,但我不想这样做,我希望我的应用程序保持跨站点请求保护。

谁能帮帮我,我该如何摆脱这个异常?

【问题讨论】:

  • 显示使用@Html.AntiForgeryToken()行的视图代码
  • 您的 @Html.AntiForgeryToken()` 是否在您的 View 中?
  • @PedroBenevides 是的,它在 Begin 表单内..抱歉回复晚了。
  • 在德语中,此消息显示为“Der Server kann den Header nicht anhängen, nachdem HTTP-Header gesendet wurden.”,以防有人在谷歌上搜索。

标签: asp.net-mvc-5 razorengine


【解决方案1】:

Response.Redirect(anyUrl)状态码设置为302时,响应头会添加:

HTTP 1.0 302 Object Moved 
Location: http://anyurl.com

ViewResult 被执行并且 razor 渲染视图时,Html.AntiForgeryToken() 将被调用,所以助手尝试在响应中添加标头 X-Frame-Options 和一些 cookie,这就是异常的原因。

但不用担心,您可以禁止添加 X-Frame-Options 标头,只需将此 AntiForgeryConfig.SuppressXFrameOptionsHeader = true; 放在 Application_start 中即可。

但我建议你改变这个:

Response.Redirect(returnUrl);

return Redirect(returnUrl);

注意

由于 .NET 代码已打开,您可以看到 AntiForgeryToken 的工作原理,请参阅此处 AntiForgeryWorker

【讨论】:

  • RedirectToAction("Logout", "Authentication"); 时出现错误
  • 什么是header X-Frame-Options
【解决方案2】:

Response.Redirect(returnUrl) 遇到了同样的错误。改成Response.Redirect(returnUrl, false) 后问题解决了。

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 2011-02-21
    • 2023-03-08
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多