IIS está anulando el contenido de mi respuesta, si configuro manualmente el Response.StatusCode

20

Problema

cuando configuro manualmente el HTTP Statusflujo de mi respuesta en, por ejemplo, 404o 503, IIS muestra el contenido / vista de IIS de stock, en lugar de mi vista personalizada.

Cuando hago esto con el servidor de desarrollo web (AKA. Cassini ), funciona correctamente (es decir, mi contenido se muestra y el response.statuscode== mis datos ingresados).

¿Hay alguna forma de anular este comportamiento?

Cómo replicar

Haga una aplicación web ASP.NET MVC1 predeterminada. Agrega la siguiente ruta

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{*catchall}",
        new { controller = "Home", action = "Index" }
        );

}

Ahora reemplace el método de índice de HomeController con ...

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 404;
        return View();
    }
}
Pure.Krome
fuente

Respuestas:

18

Ok, encontré la respuesta. Como esperaba, IIS está secuestrando mis no 200 respuestas. No estoy seguro (es decir, no estoy seguro de si este es el comportamiento predeterminado O es debido a una configuración actualizada de uno de los miembros del equipo en la configuración de la máquina, etc.).

De todos modos, la clave aquí es decirle a IIS que no maneje ningún recurso de resultado de estado que no sea 200.

¿Cómo? Entrada de configuración en web.config.

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"/>
    .... snipped other IIS relevant elements ... 
</system.webServer>

Ahora, la clave aquí es existingResponse="PassThrough". Ese chico malo le dice a IIS que deje mis recursos en paz si el código de estado HTTP! = 200.

¿Quieres más información? Claro: lea más sobre este elemento en el sitio web oficial de IIS .

Pure.Krome
fuente
httpErrors es como Páginas de error -> 500 -> Editar configuración de funciones -> "Errores detallados" _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet
AAAAHHH .. El bueno de IIS haciendo cosas fáciles difícil :)
AR
-2

Tenga cuidado con ese enfoque en general. NO debe representar una vista sobre el estado 404.

  • Creo que cuando se devuelve un código de estado de error, IIS devuelve la página de error de estado que está registrada con él, no el resultado del procesamiento. Entonces, puedes poner una página HTML allí (o un enlace a una página aspx). http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx tiene una buena explicación sobre cómo configurar una página de error.

  • Pero eso es irrelevante. Varios navegadores por defecto NO muestran esa salida, sino algo configurado en el navegador. Entonces, si confía en que las personas vean su página 404, eso puede no suceder. Pueden ver la página 404 que está configurada en el navegador para ellos.

TomTom
fuente
1
¿Por qué no debería representar una vista en un 404? Quiero una página personalizada, y mi página puede requerir algo de lógica (en lugar de una página estática de error html).
Pure.Krome
Porque el modelo MVC no se integra con el modelo de página de error IIS. Así de simple Tienes que volver al modelo IIS para eso. Registre una URL de página para el caso 404. Ponga alguna página dinámica allí: no estoy seguro de si esto PODRÍA volver a apuntar a una URL de MVC, pero DEBE originarse en el registro de la página 404.
TomTom
Incorrecto. La mayoría de los navegadores mostrarán el contenido de una página devuelta con un estado HTTP 404. No todos, pero la mayoría. Además, IIS respetará de manera predeterminada el código de estado establecido por cualquier código en un sitio .NET, siempre y cuando ningún otro módulo lo anule más adelante en la tubería. Vea la respuesta del autor de la pregunta sobre cómo sucedió eso en este caso.
Mufasa