.Net Core AOP之IResultFilter


一、簡介

在.net core 中Filter分為以下六大類:

1、AuthorizeAttribute(權限驗證)

2、IResourceFilter(資源緩存)

3、IActionFilter(執行方法前后的記錄)

4、IResultFilter(結果生成前后擴展)

5、IAlwaysRun(響應結果的補充)

6、IExceptionFilter(異常處理)

二、IResultFilter(同步)

1、定義Filter

public class CustomerResultFilterAttribute : Attribute, IResultFilter
    {
        /// <summary>
        /// 在xx結果之前
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResultExecuting(ResultExecutingContext context)
        {

            Console.WriteLine("CustomerResultFilterAttribute.OnResultExecuting");
            
            if(context.Result is JsonResult)
            {
                JsonResult result= (JsonResult)context.Result;

                context.Result = new JsonResult(new { 
                 Data= result.Value,
                 Success=true
                });
            }
        }

        /// <summary>
        /// 在xx結果之后
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResultExecuted(ResultExecutedContext context)
        {
            Console.WriteLine("CustomerResultFilterAttribute.OnResultExecuted");
        }
    }

 

2、使用Filter

public class Home2Controller : Controller
    {
        private readonly ILogger<Home2Controller> _logger;

        public Home2Controller(ILogger<Home2Controller> logger)
        {
            _logger = logger;
            Console.WriteLine($"執行 {this.GetType().Name} 構造函數");
        }

        [CustomerResultFilter] // 當Filter中有構造函數時,需這樣調用:[TypeFilter(typeof(CustomerResultFilterAttribute))]
        public IActionResult Index()
        {
            Console.WriteLine($"執行 Index 方法");

            return Json(new { id="11",name="heheh"});
            
        }
    }

 

三、IAsyncResultFilter(異步)

 

public class CustomerAsyncResultFilterAttribute : Attribute, IAsyncResultFilter
    {
        public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
        {

            if (context.Result is JsonResult)
            {
                JsonResult result = (JsonResult)context.Result;

                context.Result = new JsonResult(new
                {
                    Data = result.Value,
                    Success = true
                });
            }
            await next.Invoke(); // 這里及時去渲染結果去了

           
        }
    }

 

 

 

四、總結

作用:適用於統一返回Action的結果格式,JSON格式的統一處理

 

執行順序 
1、先執行Action 方法結束
2、CustomerResultFilterAttribute.OnResultExecuting 3、渲染試圖或返回Action結果 4、CustomerResultFilterAttribute.OnResultExecuted

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM