2013-07-03 10 views
6

Non riesco a ottenere l'HandleErrorAttribute personalizzato da utilizzare nella mia applicazione MVC4.MVC4 Custom HandleErrorAttribute, metodo in global.asax non chiamato

classe

personalizzato che registra eccezione

public class HandleAndLogErrorAttribute : HandleErrorAttribute 
    { 
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); 

    public override void OnException(ExceptionContext filterContext) 
    { 
     var message = string.Format("Exception  : {0}\n" + 
            "InnerException: {1}", 
            filterContext.Exception, 
            filterContext.Exception.InnerException); 
     Logger.Error(message); 
     base.OnException(filterContext); 
    } 
    } 

In Global.asax ho aggiunto un nuovo metodo statico:

public class MvcApplication : System.Web.HttpApplication 
    { 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
    } 

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleAndLogErrorAttribute()); //Todo: log all errors 
     throw new Exception("not called???"); 
    } 

    } 

quando viene generata un'eccezione, l'error.chstml è caricato, ma l'override di OnException nel custom HandlErrorAttribute non viene mai chiamato.

Ho il sospetto che il metodo RegisterGlobalFilters in Global.asax non venga chiamato, e lanciando un'eccezione lì (vedi codice) lo conferma. Questa eccezione non viene mai lanciata.

Nel file web.config ho impostato customErrors On:

<customErrors mode="On"> 
</customErrors> 

ho usato lo stesso approccio in un'altra soluzione, e non riesco a capire perché questa estensione HandleErrorAttribute non sta funzionando.

risposta

9

È stato creato il metodo RegisterGlobalFilters all'interno di Global.asax, ma da MVC 4 la registrazione dei filtri globali è specificata in un file separato in App_Start/FilterConfig.cs.

La riga FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters) nel proprio Global.asax sta richiamando la registrazione definita nel file specificato.

Aggiungere la registrazione del filtro personalizzato nel file specificato o chiamare manualmente (locale) RegisterGlobalFilters in Application_Start.

+0

È diverso da MVC3? Perché credo di aver usato lo stesso approccio lì con successo. Grazie per la risposta! – Kman

+0

Sì, è diverso da MVC3. e ha senso che ha funzionato per te perché quello era il modo normale per registrare i filtri, aggiungendoli al 'public static void RegisterGlobalFilters' definito in' Global.asax' stesso. – haim770

+0

@ haim770, se usi 'Trova riferimenti' sul tuo metodo' RegisterGlobalFilters' vedrai che non fa riferimento a nessun codice. Questo sarebbe il caso indipendentemente dalla versione MVC. – MEMark

Problemi correlati