asp.net-mvc-5 - examples - razorengine engine razor runcompile
El servidor no puede agregar encabezado después de que se han enviado encabezados HTTP Excepción en @ Html.AntiForgery (2)
Estaba obteniendo el mismo error con Response.Redirect(returnUrl)
. Después de cambiar a Response.Redirect(returnUrl, false)
corrigió el problema.
Estoy desarrollando una aplicación asp.net mvc 5 en la que estaba intentando redireccionar a ReturnUrl aplicando el siguiente código:
[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();
}
El código anterior está funcionando bien, pero el problema es que cuando publico el formulario de inicio de sesión, me da una excepción que nunca he enfrentado antes y tengo dificultades para resolver la excepción que se está generando en la vista en Login.cshtml , En línea :
@Html.AntiForgeryToken()
Y la excepción que arroja:
Server cannot append header after HTTP headers have been sent.
Investigué mucho, pero no puedo llegar a la conclusión. Mi aplicación funciona bien cuando elimino la línea @ Html.AntiForgeryToken (), pero no quiero hacer esto, quiero que mi aplicación permanezca protegida para solicitudes entre sitios.
¿Alguien puede ayudarme? ¿Cómo me deshago de esta excepción?
Cuando Response.Redirect(anyUrl)
el código de estado se establece en 302, y el encabezado se agregará a la respuesta:
HTTP 1.0 302 Object Moved
Location: http://anyurl.com
Y cuando ViewResult
se ejecuta y razor representa la vista, se Html.AntiForgeryToken()
, por lo que el helper intenta agregar el encabezado X-Frame-Options
y algunas cookies a la respuesta, es la causa de la excepción.
Pero no se preocupe, puede suprimir la adición del encabezado X-Frame-Options
, simplemente ponga este AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
en Application_start
.
Pero te sugiero que cambies esto:
Response.Redirect(returnUrl);
a
return Redirect(returnUrl);
Nota
Desde que se abrió el código .NET, puedes ver cómo funciona AntiForgeryToken
, mira aquí AntiForgeryWorker