Non riesco a ottenere l'HandleErrorAttribute personalizzato da utilizzare nella mia applicazione MVC4.MVC4 Custom HandleErrorAttribute, metodo in global.asax non chiamato
classepersonalizzato 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.
È diverso da MVC3? Perché credo di aver usato lo stesso approccio lì con successo. Grazie per la risposta! – Kman
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
@ 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