在asp.net core中,有时候我们需要实现在control层我们希望给action加上一个属性,以便实现一个全局的拦截器种部分action不需要这个拦截器拦截,比如下面:
[IgnoreResultHandle] public IActionResult Index() { return View(); }
然后我们希望在统一处理的时候忽略对该action的处理,但使用中会发现并无法直接用ActionDescriptor.GetCustomAttributes,正确的需要用以下的方法,请参考代码:
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Filters; using MyCode.Business.Message; using MyCode.Business.Enum; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; using System.Reflection; using Microsoft.AspNetCore.Mvc.Controllers; using Newtonsoft.Json; namespace MyCode.WebAdmin.Filter { public class ResultHandleAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext actionExecutedContext) { base.OnActionExecuted(actionExecutedContext); if (actionExecutedContext.Exception != null) { throw actionExecutedContext.Exception; } var controllerActionDescriptor = actionExecutedContext.ActionDescriptor as ControllerActionDescriptor; if (controllerActionDescriptor != null) { var ignore = controllerActionDescriptor.MethodInfo.GetCustomAttributes<IgnoreResultHandleAttribute>().Any(); if (!ignore) { Result result = new Result(); result.ResultCode = ResultCode.Success; if (actionExecutedContext.Result is ObjectResult) { result.Data = (actionExecutedContext.Result as ObjectResult).Value; } JsonSerializerSettings JsonSetting = new JsonSerializerSettings(); JsonSetting.Formatting = Formatting.None; actionExecutedContext.Result = new JsonResult(result, JsonSetting); } } } } }
附上类IgnoreResultHandleAttribute:
using System; using System.Collections.Generic; using System.Linq; namespace MyCode.WebAdmin.Filter { /// <summary> /// 忽略返回结果过滤 属性 /// </summary> [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,Inherited = false)] public class IgnoreResultHandleAttribute:Attribute { } }