在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
{
}
}