Je veux une page d'erreur personnalisée affichée pour 500, 404 et 403. Voici ce que j'ai fait:
Activé les erreurs personnalisées dans le web.config comme suit:
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors>
Enregistré
HandleErrorAttribute
comme filtre d'action global dans laFilterConfig
classe comme suit:public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); }
Création d'une page d'erreur personnalisée pour chacun des messages ci-dessus. Celui par défaut pour 500 était déjà disponible dès la sortie de la boîte.
Déclaré dans chaque vue de page d'erreur personnalisée que le modèle de la page est
System.Web.Mvc.HandleErrorInfo
Pour 500, il affiche la page d'erreur personnalisée. Pour d'autres, ce n'est pas le cas.
Y a-t-il quelque chose qui me manque?
Il semble que ce ne soit pas tout ce qu'il faut pour afficher les erreurs personnalisées lorsque je lis le code dans la OnException
méthode de la HandleErrorAttribute
classe et qu'il n'en gère que 500.
Que dois-je faire pour gérer d'autres erreurs?
la source
Réponses:
Ma configuration actuelle (sur MVC3, mais je pense qu'elle s'applique toujours) repose sur un
ErrorController
, donc j'utilise:Et le contrôleur contient les éléments suivants:
Et les vues comme vous les implémentez. J'ai tendance à ajouter un peu de logique cependant, pour afficher la trace de la pile et les informations d'erreur si l'application est en mode débogage. Ainsi, Error.cshtml ressemble à ceci:
la source
redirectMode="ResponseRewrite"
sur l'CustomerErrors
élément//you may want to set this to 200
dans le code. NE FAITES PAS CELA!J'ai fait la solution pablo et j'ai toujours eu l'erreur (MVC4)
Pour vous en débarrasser, supprimez la ligne
dans FilterConfig.cs
la source
Je fais quelque chose qui nécessite moins de codage que les autres solutions publiées.
Tout d'abord, dans mon web.config, j'ai les éléments suivants:
Et le contrôleur (/Controllers/ErrorPageController.cs) contient les éléments suivants:
Et enfin, la vue contient les éléments suivants (supprimés pour plus de simplicité, mais ils peuvent conta:
C'est aussi simple que ça. Il pourrait être facilement étendu pour offrir des informations d'erreur plus détaillées, mais ELMAH gère cela pour moi et le statusCode & statusDescription est tout ce dont j'ai habituellement besoin.
la source
Il semble y avoir un certain nombre d'étapes confondues ici. Je présenterai ce que j'ai fait à partir de zéro.
Créer le
ErrorPage
contrôleurAjoutez des vues pour ces deux actions (clic droit -> Ajouter une vue). Ceux-ci devraient apparaître dans un dossier appelé ErrorPage.
À l'intérieur,
App_Start
ouvrezFilterConfig.cs
et commentez le filtre de gestion des erreurs.Dans web.config, ajoutez les
<customerErrors>
entrées suivantes , sousSystem.Web
Test (bien sûr). Lancez une exception non gérée dans votre code et voyez-la aller à la page avec l'ID 500, puis utilisez une URL vers une page qui n'existe pas pour voir 404.
la source
An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.
Tout ce que j'ai récupéré de votre code est dans le fichier web.config, j'ai ajouté<error redirect = "~/ControllerName/ActionName" statusCode="404"/>
et cela a bien fonctionné :) Le reste du code provenait de la réponse de @ Pablo. J'utilise MVC 5 et l'entité framework 6. Je n'ai pas suppriméfilters.Add(new HandleErrorAttribute())
deFilterConfig.cs
Je recommanderais d'utiliser le fichier Global.asax.cs.
la source
En s'appuyant sur la réponse publiée par maxspan, j'ai mis en place un exemple de projet minimal sur GitHub montrant toutes les parties fonctionnelles.
Fondamentalement, nous ajoutons simplement une
Application_Error
méthode à global.asax.cs pour intercepter l'exception et nous donner la possibilité de rediriger (ou plus correctement, de transférer la demande ) vers une page d'erreur personnalisée.Contrôleur d'erreur:
Affichage de la page d'erreur:
Rien d'autre n'est impliqué, à part la désactivation / suppression
filters.Add(new HandleErrorAttribute())
dans FilterConfig.csBien que très simple à implémenter, le seul inconvénient que je vois dans cette approche est d'utiliser la chaîne de requête pour fournir des informations d'exception à la page d'erreur cible.
la source
J'avais tout configuré, mais je ne pouvais toujours pas voir les pages d'erreur appropriées pour le code d'état 500 sur notre serveur de transfert, malgré le fait que tout fonctionnait bien sur les serveurs de développement local.
J'ai trouvé cet article de blog de Rick Strahl qui m'a aidé.
J'avais besoin d'ajouter
Response.TrySkipIisCustomErrors = true;
à mon code de gestion des erreurs personnalisé.la source
Voici ma solution. Utilisez [ExportModelStateToTempData] / [ImportModelStateFromTempData] est inconfortable à mon avis.
~ / Vues / Accueil / Error.cshtml:
~ / Contrôleurs / HomeController.sc:
~ / Contrôleurs / BaseController.sc:
~ / Contrôleurs / MyController.sc:
Je vous souhaite des projets réussis ;-)
la source
Vous pouvez obtenir des erreurs qui fonctionnent correctement sans pirater global.cs, jouer avec HandleErrorAttribute, faire Response.TrySkipIisCustomErrors, brancher Application_Error, ou autre:
Dans system.web (juste l'habituel, on / off)
et dans system.webServer
Maintenant, les choses devraient se comporter comme prévu, et vous pouvez utiliser votre ErrorController pour afficher tout ce dont vous avez besoin.
la source
Il semble que je sois arrivé en retard à la fête, mais vous devriez aussi vérifier cela.
Donc,
system.web
pour mettre en cache des exceptions dans l'application telles que return HttpNotFound ()et
system.webServer
pour les erreurs de rattrapage qui ont été interceptées par IIS et qui n'ont pas fait leur chemin vers le cadre asp.netDans le dernier si vous vous inquiétez au sujet de la réponse du client puis modifiez le
responseMode="Redirect"
pourresponseMode="File"
et servir un fichier html statique, puisque celui - ci affiche une page amicale avec un code 200 de réponse.la source
Dans web.config, ajoutez ceci sous la balise system.webserver comme ci-dessous,
et ajouter un contrôleur comme,
et ajouter leurs opinions respectées, cela fonctionnera certainement, je suppose pour tous.
Cette solution, je l'ai trouvée à partir de: Neptune Century
la source