2014-06-13 11 views
8

Come posso implementare i filtri di eccezione in MVC5.Come utilizzare i filtri di eccezione in MVC 5

voglio lanciare l'eccezione alla NLog e reindirizzare la pagina a una pagina di errore di default che visualizza "Qualcosa è andato storto"

Ho una classe filtro come segue

using System; 
using System.Diagnostics; 
using System.Security.Policy; 
using System.Web.Mvc; 
using System.Web.Mvc.Filters; 
using System.Web.Routing; 
using System.Web.UI.WebControls; 
using Delivros.UI.Controllers; 
using Delivros.UI.Areas.User.ViewModel; 
using System.Web; 

namespace Delivros.UI.Filters 
{ 

public class CustomAuthenticationFilter : IAuthenticationFilter 
{ 
    public void OnAuthentication(AuthenticationContext filterContext) 
    { 

    } 

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) 
    { 
     Debug.WriteLine("OnAuthenticationChallenge : MyAuthenticationFilter"); 
    } 
} 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class MyAuthorizationFilter : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.RequestContext.HttpContext.Request.Cookies[System.Configuration.ConfigurationManager.AppSettings[Convert.ToString(CookieField.cookieName)]] == null) 
     { 

     } 
     else 
{ 
      filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary 
    { 
       { "controller", "User" }, 
       { "action", "UserRegistration" } , 
       {"Area","User"} 
      }); 

     } 
    } 
} 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class CustomActionFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
     filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
     filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     filterContext.HttpContext.Response.Cache.SetNoStore(); 
     base.OnResultExecuted(filterContext); 
     filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
      { 
       { "controller", "User" }, 
       { "action", "UserRegistration" } , 
       {"Area","User"} 
      }); 
     // ActionResult home = new HomeController().Index();   
    } 
} 

public class MyResultFilter : IResultFilter 
{ 
    public void OnResultExecuting(ResultExecutingContext filterContext) 
    { 

    } 

    public void OnResultExecuted(ResultExecutedContext filterContext) 
    { 

    } 
} 

public class MyExceptionFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
      { 
       { "controller", "User" }, 
       { "action", "UserLogOut" } , 
       {"Area","User"} 
      }); 

    } 
} 

}

Ma niente sta riorientando alla pagina ...

risposta

18

si potrebbe derivare il proprio HandleErrorAttribute

public class NLogExceptionHandlerAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     // log error to NLog 
     base.OnException(filterContext); 
    } 
} 

quindi registrarlo a livello globale

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new NLogExceptionHandlerAttribute()); 
    ... 
} 

Per impostazione predefinita, il HandleErrorAttribute visualizzerà la vista Error si trova nella cartella ~/Views/Shared ma se si voleva per visualizzare una vista specifica è possibile impostare la proprietà View dell'attributo .

+0

Dove devo inserire questa classe NLogExceptionHandlerAttribute? – TechNo

+0

@SajnaAli è solo un attributo, come tutti gli altri attributi in MVC, quindi può essere collocato contro un'azione, un controller o è possibile registrarlo globalmente (che è ciò che si desidera). Ho fornito un esempio di come lo fai. – James

+0

C'è già una riga in application_start in global.asax FilterConfig.RegisterGlobalFilters (GlobalFilters.Filters); dovremmo aggiungere la linea che hai menzionato sopra nel file global.asax? mostra errori – TechNo

0

credo che dovrebbe essere di questo codice:

public class MyExceptionFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { 
      action = "UserLogOut", 
      controller = "User", 
      area = "User" 
     })); 

    } 

}

Puoi aggiungere un ulteriore "se (filterContext.ExceptionHandled!)" Dichiarazione prima di accedere all'interno dei valori il risultato per assicurarsi che l'eccezione non è gestita per il momento.

Problemi correlati