1. 首页>
  2. 技术文章>
  3. asp.net core ActionExecutedContext得不到getcustomattributes

asp.net core ActionExecutedContext得不到getcustomattributes

10/30/17 10:45:46 PM 浏览 1442 评论 0

getcustomattributes dotnetcore

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


网友讨论