服务器无法在发送 HTTP headers 后追加 Header @Html.AntiForgery 异常
Server Cannot Append Header After HTTP headers have been sent Exception at @Html.AntiForgery
我正在开发一个 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();
}
上面的代码工作正常,但问题是当我 Post 登录表单时,它给了我一个我以前从未遇到过的异常,我很难解决这个异常正在 Login.cshtml 中的视图中生成,位于行:
@Html.AntiForgeryToken()
以及它抛出的异常:
Server cannot append header after HTTP headers have been sent.
我研究了很多,但我无法得出结论。当我删除 @Html.AntiForgeryToken() 行时,我的应用程序工作正常,但我不想这样做,我希望我的应用程序保持 cross-site 请求保护。
任何人都可以帮助我,我该如何摆脱这个异常?
当Response.Redirect(anyUrl)
状态码设置为302时,header将添加到响应中:
HTTP 1.0 302 Object Moved
Location: http://anyurl.com
并且当 ViewResult
被执行并且 razor 渲染视图时 Html.AntiForgeryToken()
将被调用,因此助手尝试将 header X-Frame-Options
和一些 cookie 添加到response,就是异常的原因。
不过不用担心你可以抑制添加X-Frame-Options
header,只要把这个AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
放在Application_start
.
但我建议你改变这个:
Response.Redirect(returnUrl);
到
return Redirect(returnUrl);
备注
由于 .NET 代码已打开,您可以看到 AntiForgeryToken
的工作原理,请参阅此处 AntiForgeryWorker。
我遇到了与 Response.Redirect(returnUrl)
相同的错误。更改为 Response.Redirect(returnUrl, false)
后问题已解决。
我正在开发一个 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();
}
上面的代码工作正常,但问题是当我 Post 登录表单时,它给了我一个我以前从未遇到过的异常,我很难解决这个异常正在 Login.cshtml 中的视图中生成,位于行:
@Html.AntiForgeryToken()
以及它抛出的异常:
Server cannot append header after HTTP headers have been sent.
我研究了很多,但我无法得出结论。当我删除 @Html.AntiForgeryToken() 行时,我的应用程序工作正常,但我不想这样做,我希望我的应用程序保持 cross-site 请求保护。
任何人都可以帮助我,我该如何摆脱这个异常?
当Response.Redirect(anyUrl)
状态码设置为302时,header将添加到响应中:
HTTP 1.0 302 Object Moved
Location: http://anyurl.com
并且当 ViewResult
被执行并且 razor 渲染视图时 Html.AntiForgeryToken()
将被调用,因此助手尝试将 header X-Frame-Options
和一些 cookie 添加到response,就是异常的原因。
不过不用担心你可以抑制添加X-Frame-Options
header,只要把这个AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
放在Application_start
.
但我建议你改变这个:
Response.Redirect(returnUrl);
到
return Redirect(returnUrl);
备注
由于 .NET 代码已打开,您可以看到 AntiForgeryToken
的工作原理,请参阅此处 AntiForgeryWorker。
我遇到了与 Response.Redirect(returnUrl)
相同的错误。更改为 Response.Redirect(returnUrl, false)
后问题已解决。