如何在MVC 5中使用异常过滤器

Tec*_*hNo 11 asp.net visual-studio-2013 asp.net-mvc-5

我如何在MVC5中实现异常过滤器.

我想将异常抛给NLog并将页面重定向到默认错误页面,显示"出错了"

我有一个Filter类如下

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

    }
}
Run Code Online (Sandbox Code Playgroud)

}

但没有任何东西重定向到页面......

Jam*_*mes 21

您可以派生自己的HandleErrorAttribute

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

然后在全球注册

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new NLogExceptionHandlerAttribute());
    ...
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,HandleErrorAttribute将显示Error位于~/Views/Shared文件夹中的视图,但如果要显示特定视图,则可以设置View属性的属性.

  • @SajnaAli不,转到你的`FilterConfig.cs`文件并在`RegisterGlobalFilters`方法中添加上面的行. (2认同)