IIS remplace le contenu de ma réponse, si je définis manuellement le Response.StatusCode

20

Problème

lorsque je définit manuellement le HTTP Statusflux de réponse sur, disons 404ou 503, IIS rend le contenu / la vue IIS stock, au lieu de ma vue personnalisée.

Lorsque je fais cela avec le serveur de développement Web (AKA. Cassini ), cela fonctionne correctement (c'est-à-dire que mon contenu est affiché et response.statuscode== mes données saisies).

Existe-t-il un moyen de contourner ce comportement?

Comment répliquer

Créez une application Web ASP.NET MVC1 par défaut. Ajoutez l'itinéraire suivant

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

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

}

Remplacez maintenant la méthode Index HomeController par ...

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

Réponses:

18

Ok - a trouvé la réponse. Comme je m'y attendais, IIS détourne mes non 200 réponses. Pas sûr (c'est-à-dire que je ne sais pas si c'est le comportement par défaut OU c'est à cause d'un paramètre mis à jour par un des membres de l'équipe dans la configuration de la machine, etc ...).

Quoi qu'il en soit, la clé ici est de dire à IIS de ne pas gérer les ressources de résultat d'état non 200.

Comment? Entrée de configuration dans le web.config.

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

Maintenant, la clé ici est existingResponse="PassThrough". Ce mauvais garçon dit à IIS de laisser mes ressources seules si le code d'état HTTP! = 200.

Vous voulez plus d'informations? Bien sûr: En savoir plus sur cet élément sur le site Web officiel d'IIS .

Pure.Krome
la source
httpErrors est comme les pages d'erreur -> 500 -> Modifier les paramètres des fonctionnalités -> «Erreurs détaillées» ? _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet
aaaahhh .. Bon vieux IIS rendant les choses faciles difficiles :)
AR
4

Une autre façon de contourner cela est d'exécuter le code suivant dans votre application ASP:

Response.TrySkipIisCustomErrors = true;

Source: /programming//a/21271085/238753

Sam
la source
-2

Soyez prudent avec cette approche en général. Vous ne devez PAS afficher une vue sur l'état 404.

  • Je pense que lorsqu'un code d'état d'erreur est renvoyé, IIS renvoie la page d'erreur d'état qui est enregistrée avec lui - pas la sortie du traitement. Ainsi, vous pouvez y mettre une page HTML (ou un lien vers une page aspx). http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx a une belle explication sur la façon de configurer une page d'erreur.

  • Mais ce n'est pas pertinent. Un certain nombre de navigateurs par défaut ne montrent pas cette sortie, mais quelque chose de défini dans le navigateur. Donc, si vous comptez sur les gens qui voient votre page 404 - cela peut ne pas arriver. Ils peuvent voir la page 404 configurée pour eux dans le navigateur.

TomTom
la source
1
Pourquoi ne devrais-je pas afficher une vue sur un 404? je veux une page personnalisée, et ma page peut nécessiter une certaine logique (au lieu d'une page d'erreur html statique).
Pure.Krome
car le modèle MVC ne s'intègre pas au modèle de page d'erreur IIS. C'est simple. Vous devez revenir au modèle IIS pour cela. Enregistrez une URL de page pour le boîtier 404. Mettez une page dynamique là-bas - je ne sais pas si cela POURRAIT réellement pointer vers une URL MVC, mais cela doit provenir de l'enregistrement de la page 404.
TomTom
Incorrect. La plupart des navigateurs afficheront le contenu d'une page renvoyée avec un état HTTP 404. Pas tous, mais la plupart. En outre, IIS par défaut respectera le code d'état défini par n'importe quel code dans un site .NET, tant qu'aucun autre module ne le remplacera plus tard dans le pipeline. Voir la réponse de l'auteur de la question sur la façon dont cela s'est produit dans ce cas.
Mufasa