2014-06-13 1 views
8

Wie kann ich Exception-Filter in MVC5 implementieren?Verwendung von Exception-Filtern in MVC 5

Ich möchte die Ausnahme NLog werfen und die Seite auf eine Seite Standardfehler umleiten, die zeigt

„Etwas schief gegangen ist“

ich eine Filterklasse haben wie folgt

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"} 
      }); 

    } 
} 

}

Aber nichts auf der Seite umgeleitet ...

Antwort

18

Sie könnten Ihre eigene HandleErrorAttribute

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

es dann registrieren global

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

Standardmäßig wird die HandleErrorAttribute die im ~/Views/Shared Ordner Error Ansicht angezeigt werden, aber wenn Sie eine bestimmte Ansicht angezeigt werden wollten können Sie die View Eigenschaft des Attributs gesetzt .

+0

Wo sollte ich diese Klasse NLogExceptionHandlerAttribute setzen? – TechNo

+0

@SajnaAli es ist nur ein Attribut, wie alle anderen Attribute in MVC, daher kann es gegen eine Aktion, Controller oder Sie können es global registrieren (was Sie scheinen zu wollen). Ich habe ein Beispiel dafür gegeben, wie Sie das tun. – James

+0

Es gibt bereits eine Zeile in application_start in global.asax FilterConfig.RegisterGlobalFilters (GlobalFilters.Filters); sollten wir die oben erwähnte Zeile in der Datei global.asax hinzufügen? es zeigt Fehler – TechNo

0

Ich glaube, es sollte dieser Code sein:

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

    } 

}

Sie eine weitere hinzufügen können „if (filterContext.ExceptionHandled!)“ Anweisung bevor Sie die Werte innerhalb des Ergebnis Protokollierung, um sicherzustellen, dass Die Ausnahme ist im Moment unbehandelt.