当前位置:  开发笔记 > 后端 > 正文

服务器无法附加标头在HTTP标头发送后,@ Html.AntiForgery发送异常

如何解决《服务器无法附加标头在HTTP标头发送后,@Html.AntiForgery发送异常》经验,为你挑选了2个好方法。

我正在开发一个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()行时,我的应用程序工作正常,但我不想这样做,我希望我的应用程序保持跨站点请求保护.

任何人都可以帮助我,我如何摆脱这个例外?



1> Joel R Micha..:

Response.Redirect(anyUrl)状态代码设置为302时,标题将添加到响应中:

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

并且当ViewResult执行并且剃刀渲染视图时Html.AntiForgeryToken()将调用,因此帮助程序尝试将标头X-Frame-Options和一些cookie 添加到响应中,这是异常的原因.

但是不要担心你可以抑制添加X-Frame-Options标题,只需把它AntiForgeryConfig.SuppressXFrameOptionsHeader = true;放在Application_start.

但我建议你改变这个:

Response.Redirect(returnUrl);

return Redirect(returnUrl);

注意

自.NET代码打开以来,您可以看到它是如何AntiForgeryToken工作的,请参阅此处AntiForgeryWorker.



2> 小智..:

我得到同样的错误Response.Redirect(returnUrl).更改为Response.Redirect(returnUrl, false)修复问题后.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有