web-dev-qa-db-fra.com

Quelle est la différence entre customErrors et httpErrors?

Quelle est la différence entre les sections customErrors et httpErrors du fichier web.config dans les applications ASP.NET MVC?

Quelles sont les directives d'utilisation de chaque section?

159
Alan T

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

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

customErrors sont un élément hérité (à compatibilité ascendante), utilisé par le serveur de développement Visual Studio (alias VSDS ou Cassini).

httpErrors sont le nouvel élément utilisé uniquement par IIS7.

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

En outre, référez-vous à ce message par moi-même pour savoir comment gérer les messages d'erreur avec IIS7, si vous souhaitez avoir le contrôle total de la sortie d'erreur.

Sommaire:

  • Développer dans VSDS - utiliser customErrors
  • Publier le site sur IIS6 - utilise customErrors
  • Publier le site sur IIS7 _ - utilise httpErrors.

et si vous développez avec VSDS mais publiez vers IIS7, alors je suppose que vous aurez besoin des deux.

81
Pure.Krome

* Mis à jour en avril 2016

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

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

Il y a beaucoup de pièges à essayer pour configurer ceci correctement. Donc, si vous recherchez un exemple rapide, les 2 meilleures options que vous puissiez utiliser sont les suivantes:

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 page 404):

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

Remarque: L'utilisation d'URL sans extension dans la section customErrors est impossible! . (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.

Arrière-plan

Une bonne page d'erreur personnalisée va:

  1. Afficher la véritable 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 redirige pas, mais affiche simplement le contenu de la page d'erreur (pour des raisons de référencement)
  4. Affiche le code de statut correct

Donc, pour clarifier certaines options de notre configuration:

  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 véritable erreur
    • RemoteOnly = Affiche l'erreur localement, mais affiche la page d'erreur personnalisée à distance. Nous voulons donc RemoteOnly pour l'instruction 1
  2. <customErrors redirectMode="ResponseRewrite". Vous pouvez spécifier ici: ResponseRedirect ou ResponseRewrite. Le mode ResponseRedirect redirige la page d'erreur vers la page d'erreur personnalisée. Pour un crawler de liens (SEO), cela donnera 302 -> 500, mais vous voulez que le crawler de liens obtienne une erreur 500.

  3. <httpErrors errorMode="DetailedLocalOnly". C'est l'équivalent du mode customErrors. Les 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

126
Maarten Kieft

<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
  • traite uniquement les demandes dans l'application ASP.NET
  • les fichiers statiques tels que les fichiers HTML ou les URL de répertoire ("conviviales") ne sont pas gérés

<httpErrors>

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

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

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


ExecuteURL sert un contenu dynamique tel qu'une page .aspx (la valeur path doit être une URL relative du 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 sert 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

33
JohnB

La section Errors de Web Config est destinée à fournir une approche personnalisée de gestion des erreurs http. Il existe 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 déjà utilisée auparavant IIS 7 introduit, IIS 6 5 et avant utilisez pleinement cette section pour la gestion des erreurs http personnalisées en fonction du code de statut http.

httpErrors: IIS 7 et les versions ultérieures utilisent cette section ainsi que customErrors section pour gérer les erreurs http personnalisées en fonction de leurs extensions de fichier si l'extension de page demandée s'inscrit avec ISAPI dll (.aspx, ashx, .asmx, .svc, etc.) comme index.aspx, puis IIS à prendre dans la section customeErrors , sinon il prend à partir de httpErrors (le mode hébergé IIS 7 doit être défini en tant qu'ambiance intégrée et non classique)

vous trouverez ci-dessous des exemples de liens de contrôle de gestion des erreurs 404:

httperrors vs customerrors dans webconfig, iis, asp.net

4
Rohit