2010-07-01 5 views
0

Je rencontre un problème avec des exceptions affichant des traces de pile dans la page.Exceptions ASP.NET MVC ne routant pas correctement vers Customerrors route par défaut

Je pensais que je l'avais atténué en ajoutant ceci au web.config:

<customErrors mode="On" defaultRedirect="~/error/GenericError"> 
    <error statusCode="403" redirect="~/error/NoAccess" /> 
    <error statusCode="404" redirect="~/error/NotFound" /> 
</customErrors> 

Il fonctionne pour les routes non existantes, mais pas lorsqu'un contrôleur renvoie une exception. Voici la logique du contrôleur:

[HandleError] 
public class DebugController : Controller 
{  
    public ActionResult Index() 
    { 
     throw new Exception("** Testing custom error Handling **"); 
     return View(); 
    } 
} 



public class ErrorController : Controller 
{ 
    // 
    // GET: /Error/ 

    public ActionResult NotFound() 
    { 
     ViewData["error"] = "That page does not exist."; 
     return View(); 
    } 

    public ActionResult GenericError() 
    { 
     if (null == TempData["error"])) 
     { 
      ViewData["error"] = "We're sorry, but an error has occurred."; 
     } 
     else 
     { 
      ViewData["error"] = TempData["error"]; 
     } 

     return View(); 
    } 

    public ActionResult NoAccess() 
    { 
     ViewData["error"] = "You are not authorized to access application"; 
     return View(); 
    } 

} 

Et voici la vue:

<%@ Page Title="" Language="C#" 
    MasterPageFile="~/Views/Shared/CenterContentNoSidebar.Master" 
    Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
GenericError 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>An Error has occurred</h2> 
    <br /> 
    <%= ViewData["error"] %> 
</asp:Content> 

<asp:Content ID="Content3" ContentPlaceHolderID="NavContent" runat="server"> 
</asp:Content> 

Dois-je mettre quelque chose dans le Global.asax pour faire ce travail?

Répondre

2

donc L'attribut HandleError gère en fait l'erreur et essayer de retourner une vue Error.aspx des contrôleurs d'afficher le dossier ou l'emplacement partagé. La section customErrors web.config n'est jamais touchée, et comme la page n'existe peut-être pas, l'écran jaune de la mort est affiché de toute façon. Les routes inexistantes fonctionnent parce que IIS lance une erreur 404 et n'a aucun contexte d'un contrôleur ou d'un attribut HandleError. Si vous voulez gérer les erreurs vous-même, je suggère de supprimer les attributs HandleError et de laisser les customErrors passer. De votre contrôleur d'erreur bien que vous deviez attraper la dernière exception cependant et faire quelque chose avec lui. Voici une bonne référence sur ce dont je parle un peu.

http://blog.dantup.com/2009/04/aspnet-mvc-handleerror-attribute-custom.html

Il est une sorte de l'un ou l'autre type de chose, attribut HandleError ou customErrors section web.config.

1

Vous voyez ce comportement à cause du [HandleError] que vous avez placé sur votre ligne supérieure. S'il vous plaît voir ce qusetion/réponse sur Stack pour plus d'informations sur l'attribut [HandleError].

StackOverflow Handle Error Q&A

Questions connexes