场景:需要记录日志、权限验证、异常捕获,如果让代码不再重复编写
代码封装:
public class MyActionFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// 执行前
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var guid = Guid.NewGuid().ToString();
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
var request = string.Empty;
if (filterContext.ActionParameters.Any())
{
request = JsonConvert.SerializeObject(filterContext.ActionParameters);
}
//logStr.AppendFormat("请求参数:{0}", JsonConvert.SerializeObject(request)); // 记录请求日志
//LogService.WriteNormalLog(actionName, request, "", $"{controllerName}/{actionName}", LogCategory.GetRequest.GetEnumDesc(), filter1: TraceId);
}
/// <summary>
/// 执行后
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
var request = string.Empty;
if (filterContext.ActionDescriptor.GetParameters() != null && filterContext.ActionDescriptor.GetParameters().Length > 0)
{
request = JsonConvert.SerializeObject(filterContext.ActionDescriptor.GetParameters());
}
var response = string.Empty;
response = JsonConvert.SerializeObject(filterContext.Result);
//logStr.AppendFormat("返回参数:{0}", JsonConvert.SerializeObject(response)); // 记录返回日志
//LogService.WriteNormalLog(actionName, request, response, $"{controllerName}/{actionName}", LogCategory.GetResponse.GetEnumDesc(), filter1: TraceId);
}
/// <summary>
/// 在执行操作结果后
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
//TODO 自己的事
}
/// <summary>
/// 在执行操作结果之前
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
//TODO 自己的事
}
}
/// <summary>
/// 登录权限验证
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeFilterAttribute : AuthorizeAttribute
{
/// <summary>验证登录</summary>
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
{
return;//无需验证登录
}
var token = filterContext.HttpContext.Request.Cookies["CookieName"];
if (string.IsNullOrEmpty(token.Value))
{
return;
}
//var returnUri = filterContext.HttpContext.Request.Url.ToString();
if (filterContext.HttpContext.Request.UrlReferrer != null)
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
filterContext.HttpContext.Response.AddHeader("url", "自定义链接");
filterContext.Result = new ContentResult();
}
else
{
filterContext.Result = new RedirectResult("自定义链接");
}
}
}
/// <summary>
/// 异常处理
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class ExceptionFilterAttribute : HandleErrorAttribute
{
/// <summary>
///在发生异常时调用
/// </summary>
/// <param name="filterContext"></param>
public override void OnException(ExceptionContext filterContext)
{
if (!filterContext.ExceptionHandled)//异常有没有被处理过
{
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
Exception ex = filterContext.Exception;
//记录日志
//WriteLog(logStr.ToString())
var result = new BaseResultMessage()
{
ResultCode = ResultCodeEnum.Exception.GetHashCode(),
ResultMsg = filterContext.Exception.Message
};
filterContext.Result = new ContentResult()
{
Content = JsonConvert.SerializeObject(result)//这个就是返回的结果
};
filterContext.ExceptionHandled = true;
}
}
}
代码使用端:
/// <summary>
/// 接口案例
/// </summary>
[MyActionFilter]
[ExceptionFilter]
[AuthorizeFilter]
public class FilterDemoController : BaseApiController
{
/// <summary>
/// AllowAnonymous代表不验证权限
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[AllowAnonymous]
[HttpPost]
public ResultMessage<int> AddStudent(AddStudentRequest request)
{
return null;
}
[HttpPost]
public ResultMessage<StudentEntity> GetStudent(FindStudentRequest request)
{
return null;
}
}