ASP.NET MVC 4 自定义操作筛选器【旧版本 - MVC3 和 MVC4】
了解操作筛选器 (C#)【旧版本 - MVC1 和 MVC2】
1、筛选器:
授权筛选器:从而安全决定是否要执行的操作方法,如执行身份验证或验证请求的属性。
操作筛选器:用于包装操作方法执行。 此筛选器可以执行其他处理,如提供给操作方法的额外数据、 检查返回值,或取消执行的操作方法
结果筛选器:用于包装的 ActionResult 对象执行。 此筛选器可以执行其他处理的结果,如修改 HTTP 响应。
异常筛选器:如果没有在操作方法中,使用授权筛选器开始和结束与结果执行的某个位置引发未处理的异常,则执行。 异常筛选器可用于任务,例如日志记录或显示错误页。
授权筛选器 – 实现IAuthorizationFilter属性。(或AuthorizeAttribute)
操作筛选器 – 实现IActionFilter属性。(或ActionFilterAttribute)
结果筛选器 – 实现IResultFilter属性。(或ActionFilterAttribute)
异常筛选器 – 实现IExceptionFilter属性。(或HandleErrorAttribute)
2、筛选器
ActionFilterAttribute:是所有属性筛选器的基类【ActionFilterAttribute Class】
OnActionExecuting(ActionExecutingContext filterContext) - 在执行控制器操作“之前”,将调用此方法
OnActionExecuted(ActionExecutedContext filterContext) – 在执行控制器操作“后”,将调用此方法。
OnResultExecuting(ResultExecutingContext filterContext): – 调用此方法在执行控制器操作结果“之前”
OnResultExecuted(ResultExecutedContext filterContext): – 调用此方法“后”在执行控制器操作结果。
AuthorizeAttribute:指定对控制器或操作方法的访问仅限于满足授权要求的用户【AuthorizeAttribute Class】
AuthorizeCore(HttpContextBase) - 当被重写时,为自定义授权检查提供入口点.
HandleUnauthorizedRequest(AuthorizationContext) - 处理授权失败的HTTP请求.
OnAuthorization(AuthorizationContext) - 当进程请求授权时调用.
OnCacheAuthorization(HttpContextBase) - 当缓存模块请求授权时调用.
HandleErrorAttribute:表示用于处理操作方法引发的异常的属性【HandleErrorAttribute Class】
OnException(ExceptionContext) - 发生异常时调用.
3、授权筛选器 - AuthorizeAttribute(示例)
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace HappyShop.Web.Filters
{
public class CustomerAuthorizeAttribute : AuthorizeAttribute
{
public new string[] Roles { get; set; }
private HttpRequestBase _request;
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
_request = httpContext.Request;
if (httpContext == null && httpContext.Session == null)
throw new ArgumentNullException("HttpContext");
if (!httpContext.User.Identity.IsAuthenticated)
return false;
if (!httpContext.Request.Cookies.AllKeys.Contains("CookieKey"))
return false;
var cookie = httpContext.Request.Cookies["CookieKey"];
if (string.IsNullOrEmpty(cookie?.Value))
{
return false;
}
if (Roles == null)
{
return true;
}
if (Roles.Length == 0)
{
return true;
}
if (Roles.Any(httpContext.User.IsInRole))
{
return true;
}
return false;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
var httpContext = filterContext.HttpContext;
_request = httpContext.Request;
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
string actionName = filterContext.ActionDescriptor.ActionName;
string roles = "1,2,3";
if (!string.IsNullOrWhiteSpace(roles))
{
this.Roles = roles.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
}
base.OnAuthorization(filterContext);
}
}
}
4、操作筛选器 - ActionFilterAttribute(示例)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace HappyShop.Web.Filters
{
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
var action = filterContext.ActionDescriptor.ActionName;
Log("OnActionExecuting", filterContext.RouteData);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted", filterContext.RouteData);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log("OnResultExecuting", filterContext.RouteData);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
}
private void Log(string methodName, RouteData routeData)
{
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
Console.WriteLine(message, "Action Filter Log");
}
}
}
5、异常筛选器 - HandleErrorAttribute(示例)
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace HappyShop.Web.Filters
{
public class CustomerExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
filterContext.ExceptionHandled = true;
var url = filterContext.RequestContext.HttpContext.Request.Url.AbsolutePath;
Exception ex = filterContext.Exception;
WriteLog(ex);
///方式一
filterContext.Result = new RedirectResult("~/Shared/Error");
///方式二
filterContext.Result = new ContentResult()
{
Content = JsonConvert.SerializeObject(new
{
Success = false,
Msg = $"--url:{DateTime.Now:HH:mm:ss.fff};服务器内部错误"
})
};
}
private void WriteLog(Exception exception)
{
//...
}
}
}
6、示例
7、示例