IIS ha la precedenza sul contenuto della mia risposta, se imposto manualmente Response.StatusCode


20

Problema

quando imposto manualmente il HTTP Statusflusso di risposta su, diciamo, 404oppure 503, IIS esegue il rendering del contenuto / vista IIS di magazzino, anziché della vista personalizzata.

Quando lo faccio con il server di sviluppo web (AKA. Cassini ), funziona correttamente (ovvero, il mio contenuto viene visualizzato e response.statuscode== i miei dati inseriti).

Esiste un modo per ignorare questo comportamento?

Come replicare

Creare un'applicazione Web ASP.NET MVC1 predefinita. Aggiungi il seguente percorso

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

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

}

Ora sostituisci il metodo Index di HomeController con ...

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

Risposte:


18

Ok - ho trovato la risposta. Come mi aspettavo, IIS sta dirottando le mie non 200 risposte. Non sono sicuro (cioè. Non sono sicuro se questo è il comportamento predefinito O è a causa di un'impostazione di uno dei membri del team aggiornati nella configurazione della macchina, ecc ...).

Ad ogni modo, la chiave qui è dire a IIS di non gestire alcuna risorsa di risultato di stato non 200.

Come? Voce di configurazione in web.config.

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

Ora, la chiave qui è existingResponse="PassThrough". Quel ragazzaccio dice a IIS di lasciare le mie risorse da solo se il codice di stato HTTP! = 200.

Vuoi maggiori informazioni? Certo: ulteriori informazioni su questo elemento sul sito Web ufficiale IIS .


httpErrors è come Pagine di errore -> 500 -> Modifica impostazioni funzionalità -> "Errori dettagliati" ? _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet

aaaahhh .. Il buon vecchio IIS rende le cose facili difficili :)
AR


-2

Stai attento con questo approccio in generale. NON è necessario eseguire il rendering di una vista sullo stato 404.

  • Penso che quando viene restituito un codice di stato dell'errore, IIS restituisce la pagina dell'errore di stato registrata con esso, non l'output dall'elaborazione. Quindi, puoi inserire lì una pagina HTML (o un collegamento a una pagina aspx). http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx ha una bella spiegazione su come impostare una pagina di errore.

  • Ma questo è irrelvant. Un certo numero di browser per impostazione predefinita NON mostra quell'output, ma qualcosa impostato nel browser. Quindi, se fai affidamento sulle persone che vedono la tua pagina 404, ciò potrebbe non accadere. Potrebbero vedere la pagina 404 che è impostata nel browser per loro.


1
Perché non dovrei eseguire il rendering di una vista su un 404? Voglio una pagina personalizzata e la mia pagina potrebbe richiedere un po 'di logica (invece di una pagina di errore HTML statica).
Pure.Krome

perché il modello MVC non si integra con il modello di pagina di errore IIS. Così semplice. Per questo devi tornare al modello IIS. Registrare un URL di pagina per il caso 404. Metti qualche pagina dinamica lì - Non sono sicuro che questo possa effettivamente tornare a un URL MVC, ma MUSt ha origine nella registrazione della pagina 404.
TomTom

Non corretto. La maggior parte dei browser visualizzerà il contenuto di una pagina restituita con uno stato HTTP 404. Non tutti, ma soprattutto. Inoltre, IIS per impostazione predefinita rispetterà il codice di stato impostato da qualsiasi codice in un sito .NET, a condizione che nessun altro modulo abbia la precedenza su quello successivo nella pipeline. Vedi la risposta dell'autore della domanda su come stava accadendo in questo caso.
Mufasa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.