我正在开发一个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()
它抛出的异常:
Server cannot append header after HTTP headers have been sent.
我研究了很多,但我无法得出结论.当我删除@ Html.AntiForgeryToken()行时,我的应用程序工作正常,但我不想这样做,我希望我的应用程序保持跨站点请求保护.
任何人都可以帮助我,我如何摆脱这个例外?
解决方法
当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