Dans notre page web asp.net (.net 4.7.2), nous utilisons une logique de rendu d'exceptions personnalisée qui crée des pages d'erreurs spécifiques pour l'utilisateur dans global.asax.cs via :
Application_Error(object sender, EventArgs e)
Cela fonctionne bien. Cependant, il y a des erreurs asp.net qui n'atteignent jamais l'événement Application_Error
.
Pour ces erreurs, nous définissons explicitement une page d'erreur dans le web.config via l'élément customErrors
. Cela ressemble à ceci :
Le Problème
Ce qui précède fonctionne bien dans la plupart des cas. Cependant, il y a quelques rares erreurs asp.net qui ne sont pas gérées par l'événement Application_Error
et qui font également en sorte que FatalError.aspx lance une exception, même s'il n'y a pas de code asp à l'intérieur. Un bon exemple d'une telle erreur est lorsque vous saisissez l'adresse réservée suivante dans votre navigateur :adresse réservée dans votre navigateur :
https://[votreSiteWeb]/com1
Cela fait en sorte que la page d'erreur par défaut basée sur .aspx affiche le message d'erreur suivant (code d'état Http 500) :
Une exception s'est produite lors du traitement de votre demande. De plus, une autre exception s'est produite lors de l'exécution de la page d'erreur personnalisée pour la première exception. La requête a été interrompue.
Même en définissant un fichier aspx qui ne contient absolument aucun code asp, cela conduit à cette erreur. Il en va de même si l'attribut defaultRedirect
est configuré vers une ressource qui n'existe pas ! Cela ne fait aucune différence non plus s'il existe des éléments error
définis sous l'élément customErrors
, qui définissent la ressource de redirection en fonction d'un code d'état http explicite.
Lorsque le redirectMode
de l'élément customErrors
est défini sur ResponseRedirect
, le gestionnaire d'erreurs par défaut basé sur aspx fonctionne bien. Cependant, ce n'est pas une option, car notre client ne souhaite pas voir de redirection.
En guise de solution de contournement, nous pouvons essayer d'utiliser un fichier html statique. Cependant, dans ce cas, asp.net envoie la réponse sans le bon type de contenu au navigateur et la page HTML est rendue comme du texte.
Il y a beaucoup de publications sur internet qui déclarent que c'est une erreur. Cependant, la solution proposée consiste toujours soit à utiliser un fichier .aspx, soit à utiliser l'événement Application_Error
dans global.asax.cs pour définir manuellement le type de contenu dans le code. Cependant, les deux variantes ne sont pas possibles dans cette situation particulière telle que décrite ci-dessus (chaque fichier aspx plante et Application_Error
n'est jamais appelé).
Question
Comment pouvons-nous configurer une gestion fiable des erreurs, qui ne montre jamais d'informations d'erreur spécifiques à asp.net mais une spécifique à l'application, même avec des cas particuliers comme décrits dans ce post.
Veuillez noter que la question ne concerne pas comment contourner l'erreur avec les noms de ressources réservées. C'est seulement un exemple et il existe probablement de nombreuses autres circonstances où des erreurs asp.net se produisent, n'atteignent jamais l'événement Application_Error
et font planter les fichiers d'erreurs basés sur aspx. L'objectif est vraiment d'avoir un mécanisme pour afficher un message d'erreur de marque d'application au lieu de messages d'erreur asp.net, qui fonctionne de manière totalement fiable.
Aussi en tant qu'observation, nous utilisons également l'élément httpErrors dans la section webServer pour modifier les erreurs qui ne proviennent pas d'asp.net mais de IIS lui-même. Cependant, nous n'avons observé aucune dépendance au problème décrit ci-dessus, donc je ne l'ai pas mentionné dans le texte principal.