Quelle est la différence entre customErrors et httpErrors?

168

Quelle est la différence entre les sections customErrorset httpErrorsdu fichier web.config dans les applications ASP.NET MVC?

Quelles sont les directives d'utilisation de chaque section?

Alan T
la source
1
IMHO - HttpError est une gestion de niveau IIS pour les messages d'erreur tandis que CustomError est une gestion ASP.Net pour les erreurs dans l'application Web. Mais j'aimerais en savoir plus ...
Sunny

Réponses:

85

Avertissement: Ceci est de mon expérience et non prouvé.

Les deux sont utilisés pour définir la gestion des erreurs pour un site Web, mais différents logiciels font référence à différents éléments de configuration.

customErrors sont un élément hérité (rétrocompatible), utilisé par Visual Studio Development Server (alias. VSDS ou Cassini).

httpErrors sont le nouvel élément qui n'est utilisé que par IIS7.

Cela met en évidence le problème possible lors du développement de sites Web ASP.NET lors de l'utilisation de VSDS au lieu de l'IIS local.

Référez - vous également à cet article pour savoir comment gérer les messages d'erreur avec IIS7, si vous souhaitez avoir un contrôle total sur la sortie d'erreur.

Résumé:

  • Développer dans VSDS- utilisercustomErrors
  • Publication du site à IIS6- utilisercustomErrors
  • Publication du site à IIS7utiliser httpErrors.

et si vous développez avec VSDSmais publiez sur IIS7, alors je suppose que vous aurez besoin des deux.

Pure.Krome
la source
30
customErrors sont pour asp.net. httpErrors sont pour IIS7, et donc gérer le contenu qui ne passe pas par le gestionnaire .net (par exemple .png, .js, etc.) Si vous voulez des pages d'erreur pour les types de contenu non -.net, utilisez les pages d'erreur IIS (httpErrors pour IIS7 , l'interface utilisateur pour IIS6.)
zcrar70
4
Je recommande d'installer et d'utiliser IIS 7 Express avec Visual Studio à des fins de débogage. Il utilisera les mêmes options de configuration que IIS 7 standard, contrairement à Cassini.
Sean
il n'est plus nécessaire d'utiliser customErrors par @johnB. Et trop nécessaire? 1.) activez "Envoyer les erreurs au navigateur" dans la section "ASP". les propriétés de débogage 2.) sous "Pages d'erreur / Modifier les paramètres des fonctionnalités", sélectionnez "Erreurs détaillées". 3.) désactiver "Afficher les messages d'erreur HTTP conviviaux" dans IE stackoverflow.com/questions/2640526/…
Kiquenet
136

* Mis à jour en avril 2016

L'attribut customErrors est utilisé lorsque le code .net lève une exception (404, 403, 500, etc.) et l'attribut httpErrors est utilisé lorsque IIS lui-même lève une exception.

  • / myfakeextensionslessurl -> httpErrors 404
  • /myfakeaspsx.aspx -> customErrors 404
  • /myfakeimage.jpg -> httpErrors 404
  • /throw500.apx -> customErrors 500
  • / throw500 -> customErrors 500

Il y a de nombreux pièges à essayer de configurer cela correctement. Donc, si vous cherchez un exemple rapide, les 2 meilleures options que vous avez sont:

Exemple 1: Utilisation de pages html

<system.web>
  <customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
    <error statusCode="403" redirect="/Error403.html" />
    <error statusCode="404" redirect="/Error404.html" />
    <error statusCode="500" redirect="/Error500.html" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="403" responseMode="File" path="Error403.html" />
    <error statusCode="404" responseMode="File" path="Error404.html" />
    <error statusCode="500" responseMode="File" path="Error500.html" />
  </httpErrors>
</system.webServer>

Exemple 2: utilisation de pages aspx

<system.web>
  <customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
    <error statusCode="403" redirect="/Error403.aspx" />
    <error statusCode="404" redirect="/Error404.aspx" />
    <error statusCode="500" redirect="/Error500.aspx" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="403" responseMode="ExecuteURL" path="Error403.aspx" />
    <error statusCode="404" responseMode="ExecuteURL" path="Error404.aspx" />
    <error statusCode="500" responseMode="ExecuteURL" path="Error500.aspx" />
  </httpErrors>
</system.webServer>

Et dans les pages d'erreur aspx, vous devez faire quelque chose comme ceci (exemple de la page 404):

<% 
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true;
 %>

Remarque: il n'est pas possible d' utiliser l'extension sans URL dans la section customErrors ! . (sans hacks)

Une solution consiste à désactiver les erreurs personnalisées et à laisser les erreurs http gérer la page personnalisée. Un ami a créé une telle configuration, quand je trouverai du temps, je partagerai le code.

Contexte

Une bonne page d'erreur personnalisée:

  1. Afficher la vraie exception lorsque vous visitez la page du problème localement
  2. Afficher une page personnalisée lorsque vous visitez la page du problème à distance
  3. Ne redirigera pas, mais affichera simplement le contenu de la page d'erreur (pour des raisons de référencement)
  4. Affiche le code d'état correct

Donc, pour clarifier certaines options de notre config:

  1. <customErrors mode="RemoteOnly". Vous pouvez spécifier ici: On, Off, RemoteOnly.

    • On = Toujours afficher les pages d'erreur personnalisées
    • Off = Toujours afficher la vraie erreur
    • RemoteOnly= Afficher l'erreur localement, mais afficher la page d'erreur personnalisée à distance. Nous voulons donc RemoteOnlypour la déclaration 1
  2. <customErrors redirectMode="ResponseRewrite". Vous pouvez spécifier ici: ResponseRedirectou ResponseRewrite. Le ResponseRedirectmode redirigera la page d'erreur vers la page d'erreur personnalisée. Pour un robot d'exploration de liens (SEO), cela entraînera 302 -> 500, mais vous voulez que le robot d'exploration de liens obtienne une erreur 500.

  3. <httpErrors errorMode="DetailedLocalOnly". C'est l'équivalent du customErrorsmode. Options que vous avez: Custom, Detailed, DetailedLocalOnly.

Un bon article de blog qui m'a beaucoup aidé est: http://benfoster.io/blog/aspnet-mvc-custom-error-pages

Maarten Kieft
la source
Quel type de relation customErrors - httpErrors et config IIS comme «Envoyer les erreurs au navigateur» dans ASP - les propriétés de débogage et «Pages d'erreur / Modifier les paramètres de fonctionnalité», «Erreurs détaillées». ? stackoverflow.com/questions/2640526/…
Kiquenet
36

<customErrors> contre <httpErrors>


<customErrors>

  • toujours disponible dans IIS7 +
  • spécifier des pages d'erreur personnalisées pour les demandes gérées par ASP.NET
  • gère uniquement les demandes dans l'application ASP.NET
  • les fichiers statiques tels que les fichiers HTML ou les URL de répertoires («conviviaux») ne sont pas gérés

<httpErrors>

  • introduit dans IIS7
  • spécifier des pages d'erreur personnalisées pour les demandes gérées par IIS
  • gère les demandes au sein de l'application ASP.NET ET / OU gère les demandes en dehors de - l'application ASP.NET *
  • tous les fichiers et URL sont gérés *

Remarque: il n'est plus nécessaire d'utiliser customErrors

Source citée: Custom 404 et pages d'erreur dans ASP.NET (excellent article)


ExecuteURLsert du contenu dynamique tel qu'une page .aspx (la pathvaleur doit être une URL relative au serveur ):

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL" >
    <remove statusCode="404"/>
    <error statusCode="404" responseMode="ExecuteURL" path="/error.aspx" />
  </httpErrors>
</system.webServer>

File diffuse un fichier d'erreur personnalisé, tel qu'une page .html:

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="File" >
    <remove statusCode="404"/>
    <error statusCode="404" path="404.html" />
  </httpErrors>
</system.webServer>

Référence: Erreurs HTTP (www.iis.net)

pour plus de détails, lisez le lien www.iis.net ci-dessus

JohnB
la source
Peut-être utile ** stackoverflow.com/questions/2640526/… ** si vous combinez httpErrors avec "Envoyer les erreurs au navigateur" et les pages d'erreur
Kiquenet
3
+1 pour la note it's no loger necesary to use customErrors et la citation, c'est vraiment l'info que j'étais après :-)
Myster
4

La section Erreurs de la configuration Web sert à fournir une approche personnalisée de gestion des erreurs http.Il y a deux sections, une customErrors dans la section system.web et une autre httpErrors dans la section system.webServer (comme indiqué ci-dessous)

customErrors: cette section était utilisée avant l'introduction d'IIS 7, IIS 6 5 et avant d'utiliser pleinement cette section pour gérer les erreurs http personnalisées en fonction du code d'état http.

httpErrors: IIS 7 et versions ultérieures utilisent cette section ainsi que la section customErrors pour gérer les erreurs http personnalisées en fonction de leurs extensions de fichier si l'extension de page est demandée, enregistrez-vous avec ISAPI dll (.aspx, ashx, .asmx, .svc, etc.) comme index.aspx puis IIS pick up setting from customeErrors section else it pick up setting from httpErrors (le mode hébergé IIS 7 doit être défini comme une ambiance intégrée et non classique)

Voici les exemples qui concernent le lien de vérification de la gestion des erreurs 404:

httperrors vs customerrors dans webconfig, iis, asp.net

Rohit
la source