前言
上兩篇文章分享了過濾器實現(xiàn)JWT進行鑒權(quán),分別是通過授權(quán)過濾器和操作過濾器實現(xiàn),這兩個過濾器也是最常用的。文章鏈接:授權(quán)過濾器—MVC中使用授權(quán)過濾器實現(xiàn)JWT權(quán)限認證,操作過濾器—MVC中使用操作過濾器實現(xiàn)JWT權(quán)限認證,接下來將簡單的談談資源過濾器在MVC中如何使用,一般項目中這個過濾器很少用到。
一、什么是資源過濾器?
過濾器(Filter)是 AOP(面向切面編程) 思想的一種實現(xiàn),供我們在執(zhí)行管道的特定階段執(zhí)行代碼,通過使用過濾器可以實現(xiàn)短路請求、緩存請求結(jié)果、日志統(tǒng)一記錄、參數(shù)合法性驗證、異常統(tǒng)一處理、返回值格式化 等等,同時使業(yè)務代碼更加簡潔單純,避免很多重復代碼。所以在我們的過濾器中,大部分過濾器有開始執(zhí)行action,即ing 狀態(tài)的方法,也有action業(yè)務代碼執(zhí)行完后觸發(fā)的ed狀態(tài)的方法。
資源過濾器在過濾器管道中第二個被執(zhí)行,通常用于請求結(jié)果的緩存和短路過濾器管道,通過實現(xiàn)接口 IResourceFilter 或者IAsyncResourceFilter。和其他過濾器一樣,實現(xiàn)接口,只是接口不同,接收的參數(shù)兩類型不同,但是這也正意味著執(zhí)行的時機不同。接收的參數(shù)類型為:ResourceExecutedContext
。
二、資源過濾器實現(xiàn)
資源過濾器定義:
資過濾器的定義,需要實現(xiàn)接口 IResourceFilter 或者IAsyncResourceFilter,接收的參數(shù)類型為:ResourceExecutedContext。
/// <summary>
/// 資源過濾器
/// </summary>
public class MyResourceFilter : Attribute, IResourceFilter//過濾器要繼承Attribute 特性,這樣我們也可以當做特性使用
{
/// <summary>
/// 內(nèi)存緩存對象
/// </summary>
private readonly IMemoryCache _memoryCache;
/// <summary>
/// 構(gòu)造注入
/// </summary>
public MyResourceFilter(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
/// <summary>
/// 資源過濾器過濾器執(zhí)行之前(befor)
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
//針對哪些Action,也可以吧特性標注在Action上
var ad = context.ActionDescriptor;
var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"];
if (str != "ResourceFilter/Test")
{
return;
}
//我們可以將當前的結(jié)果context.Result緩存起來,當執(zhí)行ing時,直接返回,為了方便示例演示,我們用時間表示。
string content = "Action第一次執(zhí)行調(diào)用時間:" + DateTime.Now;
var value = _memoryCache.Get("key"); //判斷內(nèi)存中是否有內(nèi)容,有就直接返回,不再執(zhí)行action過程。
if (value == null)
{
_memoryCache.Set("key", content);
}
}
/// <summary>
/// 資源過濾器過濾器執(zhí)行之后(after)
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
//針對哪些Action,也可以吧特性標注在Action上
var ad = context.ActionDescriptor;
var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"];
if (str != "ResourceFilter/Test")
{
return;
}
var content = _memoryCache.Get("key"); //判斷內(nèi)存中是否有內(nèi)容,有就直接返回,不再執(zhí)行action過程。
if (content != null)
{
var result = new { IsSuccess = true, Msg= _memoryCache.Get("key") };
//短路返回,不會再執(zhí)行Action中方法和OnResourceExecuted方法
context.Result = new ContentResult() { Content = Newtonsoft.Json.JsonConvert.SerializeObject(result) };
};
}
}
添加到全局過濾器:
services.AddMvc(options =>
{
options.Filters.Add<MyResourceFilter>();
});
添加測試Action:
/// <summary>
/// 資源過濾器測試
/// </summary>
public class ResourceFilterController : ControllerBase
{
/// <summary>
/// 內(nèi)存緩存對象
/// </summary>
private readonly IMemoryCache _memoryCache;
/// <summary>
/// 構(gòu)造注入
/// </summary>
/// <param name="memoryCache"></param>
public ResourceFilterController(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
/// <summary>
/// 資源過濾器測試,獲取接口第一次調(diào)用時間
/// 如果第一次調(diào)用Action:會進入Action執(zhí)行方法體
/// 如果不是第一次調(diào)用Action:在資源過濾器中直接短路返回第一次調(diào)用時間
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult Test()
{
string content = "Action第一次執(zhí)行調(diào)用時間:" + DateTime.Now;
var value = _memoryCache.Get("key"); //判斷內(nèi)存中是否有內(nèi)容,有就直接返回,不再執(zhí)行action過程。
if (value == null)
{
_memoryCache.Set("key", content);
}
return Ok(new { IsSuccess = true, Msg = content });
}
}
三、驗證:
第1次調(diào)用:
訪問地址:
https://localhost:5001/ResourceFilter/Test
文章來源:http://www.zghlxwxcb.cn/news/detail-639640.html
第N次調(diào)用:
文章來源地址http://www.zghlxwxcb.cn/news/detail-639640.html
到了這里,關(guān)于資源過濾器—MVC中使用資源過濾器實現(xiàn)不執(zhí)行Action方法體讀取緩存信息返回的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!