una servidor publicar para net mvc mostrar los lista forbidden está este error directorio contenidos configurado asp aplicacion asp.net-mvc http iis-7

asp.net mvc - publicar - El servidor no puede establecer el estado después de que se hayan enviado los encabezados HTTP IIS7.5



publicar aplicacion asp net en iis (9)

¿Qué hay de comprobar esto antes de hacer la redirección:

if (!Response.IsRequestBeingRedirected) { //do the redirect }

A veces recibo una excepción en mi entorno de producción:

  • Procesar informacion
    • ID de proceso: 3832
    • Nombre del proceso: w3wp.exe
    • Nombre de la cuenta: NT AUTHORITY / NETWORK SERVICE
  • Información de excepción
    • Tipo de excepción: System.Web.HttpException
    • Mensaje de excepción: el servidor no puede establecer el estado después de que se hayan enviado los encabezados HTTP.
  • Información requerida
    • URL de solicitud: http://www.myulr.pl/logon
    • Ruta de solicitud: / inicio de sesión
    • Dirección de host del usuario: 10.11.9.1
    • Usuario: user001
    • Está autenticado: verdadero
    • Tipo de autenticación: formularios
    • Nombre de la cuenta del hilo: NT AUTHORITY / NETWORK SERVICE
  • Hilo de información
    • ID del hilo: 10
    • Nombre de la cuenta del hilo: NT AUTHORITY / NETWORK SERVICE
    • Está suplantando: Falso

Stack trace: at System.Web.HttpResponse.set_StatusCode(Int32 value) at System.Web.HttpResponseWrapper.set_StatusCode(Int32 value) at System.Web.Mvc.HandleErrorAttribute.OnException(ExceptionContext filterContext) at System.Web.Mvc.ControllerActionInvoker.InvokeExceptionFilters(ControllerContext controllerContext, IList(1) filters, Exception exception) at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) at System.Web.Mvc.Controller.ExecuteCore() at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8(1).<BeginSynchronous>b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult(1).End() at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& ompletedSynchronously)

No me di cuenta de este error en mi entorno de prueba, ¿qué debo verificar?

Estoy usando ASP.NET MVC 2 (Release Candidate 2)


El servidor HTTP no envía el encabezado de respuesta al cliente hasta que especifique un error o de lo contrario, comienza a enviar datos. Si comienza a enviar datos al cliente, primero el servidor debe enviar el encabezado de respuesta (que contiene el código de estado). Una vez que se ha enviado el encabezado, ya no se puede poner un código de estado en el encabezado, obviamente.

Este es el problema habitual. Usted inicia la página y envía algunas etiquetas iniciales (es decir, <head> ). El servidor luego envía esas etiquetas al cliente, después de enviar primero el encabezado de respuesta HTTP con un supuesto estado de ÉXITO. Ahora empiezas a trabajar en la carne de la página y descubres un problema. No puede enviar un error en este punto porque el encabezado de respuesta, que contendría el estado de error, ya ha sido enviado.

La solución es esta: antes de generar ningún contenido, verifique si habrá algún error. Solo entonces, cuando haya asegurado que no habrá problemas, puede comenzar a enviar contenido, como la etiqueta.

En su caso, parece que tiene una página de inicio de sesión que procesa una solicitud POST desde un formulario. Probablemente eche un poco de HTML inicial, luego verifique si el nombre de usuario y la contraseña son válidos. En su lugar, primero debe autenticar el usuario / contraseña, antes de generar cualquier código HTML.


En líneas generales, estoy de acuerdo con Vagrant en la causa:

  1. su acción se estaba ejecutando, escribiendo marcas en la secuencia de respuesta
  2. la secuencia no se almacenó forzando a los encabezados de respuesta a escribirse antes de que la escritura de marcado pudiera comenzar.
  3. Su vista encontró un error de tiempo de ejecución
  4. El manejador de excepciones inicia tratando de establecer el código de estado en otra cosa que no sea 200
  5. Falla porque los encabezados ya han sido enviados.

En lo que no estoy de acuerdo con Vagrant es el remedio "no causar errores en el enlace": aún podría encontrar errores de tiempo de ejecución en el enlace de visualización, por ejemplo, excepciones de referencia nula.

Una mejor solución para esto es asegurar que Response.BufferOutput = true; antes de enviar los bytes a la secuencia de respuesta. por ejemplo, en su acción de controlador o On_Begin_Request en la aplicación. Esto permite que se establezcan transferencias de servidores, cookies / encabezados, etc. hasta llegar a una respuesta que finaliza de forma natural, o que llame a fin / descarga.

Por supuesto, también verifique que el búfer no se descargue / configure a falso más abajo en la pila también.

Referencia de MSDN: HttpResponse.BufferOutput


En realidad, estás intentando redirigir una página que tiene alguna respuesta para lanzar. Así que primero mantienes la información que has arrojado en un buffer usando response.buffer = true al principio de la página y luego lavas cuando sea necesario usando response.flush este error se arreglará


Me disculpo, pero agrego mis 2 centavos al hilo por si alguien tiene el mismo problema.

  • Utilicé la Autenticación de formularios en mi aplicación MVC
  • Pero algunas acciones del controlador eran "anónimas", es decir, permitidas para usuarios no autenticados
  • A veces, en esas acciones, aún quisiera que los usuarios sean redirigidos al formulario de inicio de sesión bajo alguna condición
  • para hacer eso, tengo esto en mi método de acción: return new HttpStatusCodeResult(401) - y ASP.NET es súper agradable para detectar esto, ¡y redirige al usuario a la página de inicio de sesión! Magia, ¿verdad? Incluso tiene el parámetro ReturnUrl adecuado, etc.

¿Pero ves a dónde voy a llegar? Devuelvo 401 . Y ASP.NET redirige al usuario. Lo cual es esencialmente devuelve 302 . Un código de estado es reemplazado por otro.

Y algunos servidores IIS (¡solo algunos!) Lanzan esta excepción. Algunos no. - No lo tengo en mi servidor de prueba, solo en mi servidor de producción (no siempre es el caso correcto o_O)

Sé que mi respuesta es esencialmente repetir lo que ya se ha dicho aquí, pero a veces es difícil imaginar dónde ocurre exactamente esta sobreescritura.


Recuerdo la parte de esta excepción: "No se puede modificar la información del encabezado - encabezados ya enviados por" que ocurren en PHP. Ocurrió cuando los encabezados ya se habían enviado en la fase de redirección y se generó cualquier otra salida, por ejemplo:

echo "hola"; encabezado ("Ubicación: http://.com ");

Perdónenme y sírvanme si me equivoco, pero todavía estoy aprendiendo sobre MS Technologies y estaba tratando de ayudar.


Si alguien todavía tiene este problema, intente utilizar en lugar de ovverriding

public void OnActionExecuting(ActionExecutingContext context) { try { if (!HttpContext.Current.User.Identity.IsAuthenticated) { if (!HttpContext.Current.Response.IsRequestBeingRedirected) { context.Result = new RedirectToRouteResult( new RouteValueDictionary { { "controller", "Login" }, { "action", "Index" } }); } } } catch (Exception ex) { new RouteValueDictionary { { "controller", "Login" }, { "action", "Index" } }); } }


Solo para agregar a las respuestas anteriores. Tuve el mismo problema cuando comencé a usar ASP.Net MVC y estaba haciendo un Response.Redirect durante una acción de controlador:

Response.Redirect("/blah", true);

En lugar de devolver una acción Response.Redirect debería haber estado devolviendo una RedirectAction :

return Redirect("/blah");


Tuve el mismo problema al establecer StatusCode y luego Response.End en el método HandleUnauthorizedRequest de AuthorizeAttribute

var ctx = filterContext.HttpContext; ctx.Response.StatusCode = (int)HttpStatusCode.Forbidden; ctx.Response.End();

Si usa .NET 4.5+, agregue esta línea antes de Response.StatusCode

filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;

Si está utilizando .NET 4.0, pruebe SuppressFormsAuthenticationRedirectModule .