98 votes

IIS7 Remplace customErrors lors de la définition de Response.StatusCode?

Ayant un problème bizarre ici. Tout le monde sait que si vous utilisez le web.config de la section customErrors de faire une page d'erreur personnalisée, que vous devez définir votre Réponse.StatusCode pour tout ce qui est approprié. Par exemple, si je fais une page 404 personnalisée et nommez-404.aspx, j'ai pu mettre <% Response.StatusCode = 404 %> dans le contenu pour en faire un vrai statut 404-tête.

Suivez-moi jusqu'à présent? Bon. Maintenant, essayez de le faire sur IIS7. Je ne peux pas le faire fonctionner, période. En Cas De Réponse.StatusCode est définie dans la page d'erreur personnalisée, IIS7 semble remplacer la page d'erreur personnalisée complètement, et il montre d'un statut propre page (si vous en avez configuré.)

Quelqu'un d'autre a vu ce problème et aussi peut-être de savoir comment le contourner? Il travaillait sous IIS6, donc je ne sais pas pourquoi les choses ont changé.

Mise à jour: Ce n'est pas la même que la question de http://stackoverflow.com/questions/347281/asp-net-custom-404-returning-200-ok-instead-of-404-not-found

116voto

Pavel Chuchuva Points 12220

Ensemble existingResponse de Relais dans le système.webServer/httpErrors section:

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

La valeur par défaut de existingResponse propriété est Automatique:

Auto dit d'erreur personnalisé module le droit de la chose. Erreur de texte vu par les clients seront affectés en fonction de la valeur de fTrySkipCustomErrors retourné en IHttpResponse::GetStatus appel. Lorsque fTrySkipCustomErrors est définie sur true, la coutume d'erreur de module permettra la réponse de passer à travers, mais si elle est définie sur false, les erreurs personnalisées module remplace le texte avec son propre texte.

Plus d'informations: Qu'attendre de IIS7 d'erreur personnalisé module

80voto

Rick Strahl Points 4166

Le moyen le plus simple de rendre le comportement cohérent est d'utiliser Response.TrySkipIisCustomErrors et de le définir sur true. Cela annulera le traitement de la page d'erreur globale IIS à partir de votre page.

Plus d'informations ici: http://www.west-wind.com/weblog/posts/745738.aspx

11voto

Nicholas Points 2532

Résolu: il s'avère que les "erreurs détaillées" doivent être activées pour que IIS7 "répercute" toute page d'erreur que vous pourriez avoir. Voir http://forums.iis.net/t/1146653.aspx

4voto

SEFL Points 64

Je ne suis pas sûr si cela est de nature similaire ou pas, mais j'ai résolu un problème qui semble similaire à la surface et voici comment j'ai géré ça.

Tout d'abord, la valeur par défaut pour existingResponse (Auto) était la bonne réponse dans mon cas, depuis que j'ai un 404 personnalisée, 400 et 500 (je pourrais en créer d'autres, mais ces trois suffira pour ce que je fais). Voici les sections pertinentes qui m'ont aidé.

À partir du web.config:

<customErrors mode="Off" />

Et

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/errors/404.aspx" responseMode="ExecuteURL" />
  <error statusCode="500" path="/errors/500.aspx" responseMode="ExecuteURL" />
  <error statusCode="400" path="/errors/400.aspx" responseMode="ExecuteURL" />
</httpErrors>

À partir de là, j'ai ajouté ceci dans Application_Error mondiale.asax:

    Response.TrySkipIisCustomErrors = True

Sur chacune de mes pages d'erreur personnalisées, j'ai dû inclure le bon code d'état de réponse. Dans mon cas, je suis sur un 404 personnalisée à envoyer aux utilisateurs pour les différentes sections de mon site, donc je ne pas veux un code d'état 404 retournés, sauf si elle est réellement morte de la page.

De toute façon, c'est la façon dont je l'ai fait. Espérons que l'aide à quelqu'un.

3voto

Shawn South Points 375

Cette question a été l'un des grands maux de tête. Aucune des solutions mentionnées précédemment seul résolu pour moi, donc je suis, y compris ma solution. Pour mémoire, notre environnement/plate-forme utilise:

  • .NET Framework 4
  • MVC 3
  • IIS8 (poste de travail) et IIS7 (serveur web)

Plus précisément, j'ai essayé d'obtenir une erreur HTTP 404 réponse qui permettrait de rediriger l'utilisateur vers notre page 404 personnalisée (via le Web.paramètres de configuration).

Tout d'abord, mon code a dû jeter un HttpException. Retour d'un NotFoundResult depuis le contrôleur n'a pas atteindre les résultats que je cherchais.

throw new HttpException(404, "There is no class with that subject");

Ensuite, j'ai eu à configurer à la fois l' customErrors et httpError des nœuds dans le Web.config.

<customErrors mode="On" defaultRedirect="/classes/Error.aspx">
  <error statusCode="404" redirect="/classes/404.html" />
</customErrors>

...

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/classes/404.aspx" responseMode="ExecuteURL" />
</httpErrors>

Notez que j'ai quitté l' existingResponse comme Auto, ce qui est différent de celui de la solution @sefl fourni.

L' customErrors paramètres est apparu nécessaire pour la manutention de mes explicitement jeté HttpException, tandis que l' httpErrors nœud géré Url qui est tombé à l'extérieur de la route motifs spécifiés dans Globals.asax.cs.

P. S. Avec ces réglages, je n'ai pas besoin de configurer Response.TrySkipIisCustomErrors

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X