## 一、什麼是結果過濾器? 結果過濾器(**ResultFilter**),是對執行的Action結果進行處理的一種AOP思想,適用於任何需要直接環繞 View 或格式化處理的邏輯。結果過濾器可以**替換或更改 Action 結果**。在 IActionResult 執行的前後執行,使用它能夠控制 ...
一、什麼是結果過濾器?
結果過濾器(ResultFilter),是對執行的Action結果進行處理的一種AOP思想,適用於任何需要直接環繞 View 或格式化處理的邏輯。結果過濾器可以替換或更改 Action 結果。在 IActionResult 執行的前後執行,使用它能夠控制Action的執行結果,比如:格式化結果等。需要註意的是,它只有在Action方法成功執行完成後才會運行。 一般項目中很少使用。
執行順序:
1、執行控制器中的構造函數,實例化控制器
2、執行具體的Action方法
3、執行ResultFilter.OnResultExecuting方法
4、渲染視圖或處理結果
5、執行ResultFilter.OnResultExecuted方法
二、結果過濾器實現
結果過濾器定義:
異結果過濾器實現了 IAsyncResultFilter 或 IResultFilter 介面,當實現IAsyncResultFilter重寫OnResultExecutionAsync方法,實現IResultFilter,重寫OnResultExecuting和OnResultExecuted方法。
/// <summary>
/// 結果過濾器
/// </summary>
public class MyResultFilter : Attribute, IResultFilter
{
#region IResultFilter
/// <summary>
///執行之前
/// </summary>
/// <param name="context"></param>
public void OnResultExecuting(ResultExecutingContext context)
{
if (context.Result is JsonResult)
{
JsonResult result = (JsonResult)context.Result;
//進行返回結果進行再次封裝
context.Result = new JsonResult(new
{
Success = true,
Message = "Ok",
Data = result.Value
});
}
}
/// <summary>
///執行之後
/// </summary>
/// <param name="context"></param>
public void OnResultExecuted(ResultExecutedContext context)
{
var result = context.Result;//拿到Json結果
Console.WriteLine("在執行之後ResultFilter.OnResultExecuted方法");
}
#endregion
#region IAsyncResultFilter
/// <summary>
/// 執行時
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
if (context.Result is JsonResult)
{
JsonResult result = (JsonResult)context.Result;
context.Result = new JsonResult(new
{
Success = true,
Message = "Ok",
Data = result.Value
});
}
await next.Invoke();
}
#endregion
}
操作級別作用範圍過濾器:
在需要使用結果過濾器上的Action標註上特性標簽
[MyResultFilter]//作用範圍是操作過濾器級別
添加測試Action:
[Route("api/[controller]")]
[ApiController]
public class ResultFilterController : Controller
{
/// <summary>
/// 測試:調用返回JSON
/// </summary>
/// <returns></returns>
[HttpGet]
[MyResultFilter]//作用範圍是操作過濾器級別
public IActionResult Test()
{
return Json(new
{
Id = 008,
Name = "Aliang",
Age = 28
});
}
}
三、驗證:
介面訪問調用:
訪問地址:
https://localhost:5001/ResultFilter/Test
調用介面時經過結果過濾器處理返回數據:
本文來自博客園,作者:碼農阿亮,轉載請註明原文鏈接:https://www.cnblogs.com/wml-it/p/17633689.html
技術的發展日新月異,隨著時間推移,無法保證本博客所有內容的正確性。如有誤導,請大家見諒,歡迎評論區指正!
開源庫鏈接,歡迎點亮:
GitHub:https://github.com/ITMingliang
Gitee:https://gitee.com/mingliang_it
GitLab:https://gitlab.com/ITMingliang
本著技術在於分享,方便大家交流學習的初心,特此建立【編程內功修煉交流群】,熱烈歡迎各位愛交流學習的程式員進群,也希望進群的大佬能不吝分享自己遇到的技術問題和學習心得!進群方式:掃下方二維碼加好友邀請進群!
【微信號】: 【公眾號】: