Réponse rapide / TL;DR
Pour les paresseux gars là-bas:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
Ensuite, supprimez cette ligne de global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Et ce n'est que pour IIS7+ et IIS Express.
Si vous êtes à l'aide de Cassini .. bien .. euh .. er.. maladroit ...
De Long, a expliqué répondre
Je sais que cela a été répondu. Mais la réponse est très SIMPLE (bravo à David Fowler et Damian Edwards pour vraiment répondre à cette).
Il n'y a pas besoin de faire quelque chose de personnalisé.
Pour ASP.NET MVC3
, tous les morceaux sont là.
Étape 1 -> mise à Jour de votre site web.config en DEUX endroits.
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
et
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
</httpErrors>
...
<system.webServer>
...
</system.web>
Maintenant, prenez soin de noter les ROUTES, j'ai décidé d'utiliser. Vous pouvez utiliser n'importe quoi, mais mes itinéraires sont
-
/NotFound
<- pour un 404 not found, page d'erreur.
-
/ServerError
<- pour toute autre erreur, comprennent les erreurs qui se produisent dans mon code. c'est une Erreur de Serveur Interne 500
Voir comment la première section en <system.web>
a seulement une entrée personnalisée? L' statusCode="404"
entrée? Je ne l'ai inscrit un code d'état, parce que toutes les autres erreurs, y compris l' 500 Server Error
(ie. ces satanés erreur qui se produit lorsque votre code a un bug et plantages de la demande de l'utilisateur) .. tous les autres erreurs sont gérées par le paramètre defaultRedirect="/ServerError"
.. ce qui est dit, si vous n'êtes pas une erreur 404 page non trouvée, alors s'il vous plaît rendez-vous sur l'itinéraire /ServerError
.
Ok. c'est hors de la voie.. maintenant à mes itinéraires répertoriés en global.asax
Étape 2 - Création d'itinéraires Mondiale.asax
Voici mon itinéraire complet de la section..
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});
routes.MapRoute(
"Error - 404",
"NotFound",
new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
"Error - 500",
"ServerError",
new { controller = "Error", action = "ServerError"}
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
Que des listes deux ignorer les routes -> axd's
et favicons
(ooo! bonus ignorer la route, pour vous!)
Ensuite (et l'ordre est IMPÉRATIF ICI), j'ai mes deux explicite erreur de manipulation des routes .. suivie par tous les autres routes. Dans ce cas, la valeur par défaut. Bien sûr, j'en ai plus, mais c'est spécial pour mon site web. Assurez-vous simplement que l'erreur routes sont en haut de la liste. L'ordre est impératif.
Enfin, alors que nous sommes à l'intérieur de notre - global.asax
le fichier, nous ne sommes PAS à l'échelle mondiale enregistrer le HandleError attribut. Non, non, non, monsieur. Nadda. Nope. Nien. Négatif. Noooooooooo...
Supprimer cette ligne d' global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
Étape 3 - Créer le contrôleur avec les méthodes d'action
Maintenant .. nous ajouter un contrôleur à deux méthodes d'action ...
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
public ActionResult ServerError()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
// Todo: Pass the exception into the view model, which you can make.
// That's an exercise, dear reader, for -you-.
// In case u want to pass it to the view, if you're admin, etc.
// if (User.IsAdmin) // <-- I just made that up :) U get the idea...
// {
// var exception = Server.GetLastError();
// // etc..
// }
return View();
}
// Shhh .. secret test method .. ooOOooOooOOOooohhhhhhhh
public ActionResult ThrowError()
{
throw new NotImplementedException("Pew ^ Pew");
}
}
Ok, permet de vérifier cela. Tout d'abord, il n'y a PAS d' [HandleError]
attribut ici. Pourquoi? Parce que le construit en ASP.NET
- cadre est déjà en cours de traitement des erreurs ET nous avons spécifié toute la merde que nous devons faire pour gérer une erreur :) C'est dans cette méthode!
Ensuite, j'ai les deux méthodes d'action. Rien de difficile. Si u veut montrer toute exception info, alors u peut utiliser Server.GetLastError()
pour obtenir cette info.
Bonus WTF: Oui, j'ai fait une troisième méthode d'action, afin de tester la gestion des erreurs.
Étape 4 - Créer les Vues
Et enfin, la création de deux points de vue. Mettre em dans la vue normale spot, pour ce contrôleur.
Bonus commentaires
- Vous n'avez pas besoin d'
Application_Error(object sender, EventArgs e)
- Les étapes ci-dessus tous les travaux 100% parfaitement avec Elmah. Elmah fraking wroxs!
Et cela, mes amis, doit être.
Maintenant, bravo pour la lecture de ce bien et ont une Licorne comme prix!