ASP.NET Core中ResourceFilter過(guò)濾器的實(shí)現(xiàn)
在現(xiàn)代 Web 開(kāi)發(fā)中,ASP.NET Core 提供了強(qiáng)大的過(guò)濾器(Filters)機(jī)制,用于在處理請(qǐng)求的不同階段執(zhí)行特定的代碼邏輯。ASP.NET Core 中的 ResourceFilter
是一種非常有用的過(guò)濾器類(lèi)型,允許開(kāi)發(fā)人員在請(qǐng)求到達(dá)控制器操作方法之前或響應(yīng)返回之前執(zhí)行一些操作。在本文中,我們將詳細(xì)解析 ResourceFilter
,介紹它的工作原理、使用場(chǎng)景以及如何在實(shí)際項(xiàng)目中運(yùn)用它。
1. 什么是 ResourceFilter?
1.1 過(guò)濾器概述
ASP.NET Core 的過(guò)濾器是用于在請(qǐng)求和響應(yīng)處理的不同階段執(zhí)行自定義邏輯的一種機(jī)制。過(guò)濾器在控制器方法執(zhí)行之前、之后,或者在異常發(fā)生時(shí)執(zhí)行。它們可以幫助開(kāi)發(fā)人員對(duì)請(qǐng)求進(jìn)行驗(yàn)證、處理、修改或者進(jìn)行其他操作。常見(jiàn)的過(guò)濾器類(lèi)型包括:
- Authorization Filters(授權(quán)過(guò)濾器):用于身份驗(yàn)證和授權(quán)操作。
- Resource Filters(資源過(guò)濾器):用于資源級(jí)的處理,例如緩存、日志記錄等。
- Action Filters(操作過(guò)濾器):用于在控制器動(dòng)作執(zhí)行之前和之后執(zhí)行一些操作。
- Result Filters(結(jié)果過(guò)濾器):用于在控制器動(dòng)作返回結(jié)果后但在返回響應(yīng)之前進(jìn)行操作。
- Exception Filters(異常過(guò)濾器):用于處理在請(qǐng)求處理過(guò)程中發(fā)生的異常。
在這些過(guò)濾器中,ResourceFilter
是最早在請(qǐng)求管道中執(zhí)行的過(guò)濾器之一,通常用于處理一些資源相關(guān)的操作,比如緩存管理、日志記錄等。
1.2 ResourceFilter 的生命周期
ResourceFilter
主要有兩個(gè)方法,它們分別在請(qǐng)求處理的不同階段執(zhí)行:
OnResourceExecuting
:當(dāng)請(qǐng)求到達(dá)控制器操作方法之前執(zhí)行。此時(shí)請(qǐng)求已經(jīng)經(jīng)過(guò)了路由和模型綁定,但還未執(zhí)行控制器操作方法。在這里,我們可以處理一些請(qǐng)求級(jí)別的資源,如緩存、身份驗(yàn)證檢查等。OnResourceExecuted
:當(dāng)控制器操作方法執(zhí)行完畢并生成響應(yīng)之后,響應(yīng)還沒(méi)有返回客戶(hù)端時(shí)執(zhí)行。此時(shí)可以執(zhí)行一些響應(yīng)后的處理,比如日志記錄、緩存處理等。
2. 如何實(shí)現(xiàn) ResourceFilter?
2.1 實(shí)現(xiàn) IResourceFilter 接口
要實(shí)現(xiàn)自定義的 ResourceFilter
,你需要實(shí)現(xiàn) IResourceFilter
接口或繼承 ResourceFilterAttribute
類(lèi)。IResourceFilter
接口包含兩個(gè)方法:OnResourceExecuting
和 OnResourceExecuted
,你可以在這些方法中定義需要在請(qǐng)求生命周期中的不同階段執(zhí)行的操作。
示例:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的日志記錄過(guò)濾器
假設(shè)我們需要?jiǎng)?chuàng)建一個(gè) ResourceFilter
,用于記錄請(qǐng)求的開(kāi)始和結(jié)束時(shí)間。下面是一個(gè)簡(jiǎn)單的實(shí)現(xiàn):
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; using System; public class LogResourceFilter : IResourceFilter { private readonly ILogger<LogResourceFilter> _logger; public LogResourceFilter(ILogger<LogResourceFilter> logger) { _logger = logger; } // 請(qǐng)求開(kāi)始時(shí)執(zhí)行 public void OnResourceExecuting(ResourceExecutingContext context) { _logger.LogInformation($"Request started at {DateTime.Now}"); } // 請(qǐng)求結(jié)束時(shí)執(zhí)行 public void OnResourceExecuted(ResourceExecutedContext context) { _logger.LogInformation($"Request ended at {DateTime.Now}"); } }
在這個(gè)示例中,LogResourceFilter
記錄了每個(gè)請(qǐng)求的開(kāi)始和結(jié)束時(shí)間。OnResourceExecuting
方法在請(qǐng)求處理開(kāi)始時(shí)執(zhí)行,而 OnResourceExecuted
方法則在請(qǐng)求處理結(jié)束后執(zhí)行。
2.2 將 ResourceFilter 應(yīng)用于控制器或方法
創(chuàng)建了 LogResourceFilter
之后,接下來(lái)需要將它應(yīng)用到控制器或具體的方法上。你可以使用 ServiceFilter
或 TypeFilter
特性來(lái)應(yīng)用 ResourceFilter
。
應(yīng)用于整個(gè)控制器
[ServiceFilter(typeof(LogResourceFilter))] public class HomeController : Controller { public IActionResult Index() { return View(); } }
應(yīng)用于控制器方法
public class HomeController : Controller { [ServiceFilter(typeof(LogResourceFilter))] public IActionResult Index() { return View(); } }
通過(guò)這種方式,你可以確保 LogResourceFilter
在請(qǐng)求進(jìn)入控制器方法之前和之后都能執(zhí)行日志記錄操作。
2.3 使用依賴(lài)注入
ResourceFilter
可以依賴(lài)注入到控制器或方法中。在 ASP.NET Core 中,依賴(lài)注入非常重要,可以讓你輕松地管理對(duì)象的生命周期。
首先,在 ConfigureServices
方法中注冊(cè) LogResourceFilter
:
public void ConfigureServices(IServiceCollection services) { // 注冊(cè)自定義的 ResourceFilter services.AddScoped<LogResourceFilter>(); services.AddControllersWithViews(); }
然后使用 ServiceFilter
特性將 LogResourceFilter
應(yīng)用到控制器或方法。
3. ResourceFilter 的使用場(chǎng)景
ResourceFilter
通常用于一些全局的、與請(qǐng)求資源處理相關(guān)的操作。以下是一些典型的應(yīng)用場(chǎng)景:
3.1 緩存處理
你可以在 OnResourceExecuting
方法中檢查請(qǐng)求是否已經(jīng)被緩存,并返回緩存的結(jié)果,避免重復(fù)的資源處理。在 OnResourceExecuted
方法中,你可以對(duì)響應(yīng)進(jìn)行緩存處理。
示例:簡(jiǎn)單的緩存檢查
public class CacheResourceFilter : IResourceFilter { public void OnResourceExecuting(ResourceExecutingContext context) { // 檢查是否有緩存的結(jié)果 var cachedResult = CheckCache(context.HttpContext.Request); if (cachedResult != null) { context.Result = cachedResult; // 如果有緩存,直接返回緩存結(jié)果 } } public void OnResourceExecuted(ResourceExecutedContext context) { // 如果沒(méi)有緩存,可以將結(jié)果緩存 if (context.Result != null) { AddToCache(context.HttpContext.Request, context.Result); } } private object CheckCache(Microsoft.AspNetCore.Http.HttpRequest request) { // 這里是檢查緩存的邏輯 return null; // 示例中返回 null,實(shí)際應(yīng)該根據(jù)請(qǐng)求來(lái)檢查緩存 } private void AddToCache(Microsoft.AspNetCore.Http.HttpRequest request, object result) { // 將結(jié)果添加到緩存 } }
3.2 日志記錄
你可以在請(qǐng)求開(kāi)始時(shí)記錄請(qǐng)求的信息,在請(qǐng)求結(jié)束時(shí)記錄響應(yīng)的狀態(tài)。這對(duì)于監(jiān)控和調(diào)試非常有幫助。
3.3 跨域資源共享(CORS)
在請(qǐng)求到達(dá)控制器方法之前,你可以通過(guò) ResourceFilter
設(shè)置跨域資源共享(CORS)策略,動(dòng)態(tài)控制哪些源可以訪(fǎng)問(wèn)你的資源。
3.4 授權(quán)檢查
盡管通常授權(quán)檢查是由 AuthorizationFilter
來(lái)完成的,但你也可以在 ResourceFilter
中進(jìn)行一些額外的驗(yàn)證。比如,根據(jù)請(qǐng)求的路徑、參數(shù)或頭信息做一些自定義的權(quán)限校驗(yàn)。
4. ResourceFilter 與其他過(guò)濾器的對(duì)比
ResourceFilter
是在請(qǐng)求管道中最早執(zhí)行的過(guò)濾器之一,它通常用于處理資源相關(guān)的操作。而其他過(guò)濾器如 ActionFilter
和 AuthorizationFilter
通常在請(qǐng)求處理的其他階段執(zhí)行。
ResourceFilter
:用于處理資源級(jí)的操作,如緩存、日志記錄、跨域設(shè)置等。ActionFilter
:用于在控制器方法執(zhí)行前后執(zhí)行操作,通常用于修改請(qǐng)求或響應(yīng)數(shù)據(jù),或者執(zhí)行業(yè)務(wù)邏輯。AuthorizationFilter
:用于身份驗(yàn)證和授權(quán)操作,確保請(qǐng)求具有適當(dāng)?shù)臋?quán)限。ExceptionFilter
:用于捕獲異常并進(jìn)行處理。
ResourceFilter
通常用于請(qǐng)求級(jí)別的預(yù)處理操作,而 ActionFilter
則用于處理與具體操作方法相關(guān)的任務(wù)。
5. 總結(jié)
ResourceFilter
是 ASP.NET Core 中非常強(qiáng)大的一種過(guò)濾器類(lèi)型,它允許開(kāi)發(fā)人員在請(qǐng)求處理的早期階段(控制器方法執(zhí)行之前)進(jìn)行資源級(jí)的處理。通過(guò)實(shí)現(xiàn) IResourceFilter
接口,開(kāi)發(fā)人員可以在請(qǐng)求到達(dá)控制器前后執(zhí)行自定義邏輯,如緩存管理、日志記錄、跨域資源共享等。由于 ResourceFilter
在請(qǐng)求管道中執(zhí)行的優(yōu)先級(jí)較高,因此它非常適用于一些全局的資源處理操作。
掌握 ResourceFilter
的使用,可以幫助你更好地控制請(qǐng)求的生命周期,提升應(yīng)用的性能和可維護(hù)性。
到此這篇關(guān)于 ASP.NET Core中ResourceFilter過(guò)濾器的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān) ASP.NET Core ResourceFilter過(guò)濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET調(diào)用WebService服務(wù)的方法詳解
這篇文章主要介紹了ASP.NET調(diào)用WebService服務(wù)的方法,較為詳細(xì)的分析了WebService服務(wù)的功能,創(chuàng)建步驟與使用方法,需要的朋友可以參考下2016-05-05Silverlight中同步調(diào)用WebClient的解決辦法,是同步!
如何建立web服務(wù)并引用的細(xì)節(jié),不是本文的介紹的目標(biāo),不再贅述。在silverlight調(diào)用服務(wù)器端服務(wù)的時(shí)候,默認(rèn)情況下是進(jìn)行異步調(diào)用的2011-04-04C# 調(diào)用存儲(chǔ)過(guò)程簡(jiǎn)單完整的實(shí)例代碼
自己copy過(guò)來(lái)的,忘了出處,一來(lái)分享,二來(lái)保存起來(lái),想學(xué)習(xí)c#與存儲(chǔ)過(guò)程結(jié)合使用的朋友可以參考下。2010-01-01詳解ASP.NET Core 網(wǎng)站發(fā)布到Linux服務(wù)器
本篇文章主要介紹了ASP.NET Core 網(wǎng)站發(fā)布到Linux服務(wù)器 。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04ASP.NET保存PDF、Word和Excel文件到數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了ASP.NET保存PDF、Word和Excel文件到數(shù)據(jù)庫(kù)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01對(duì)GridView的行加顏色并彈出Kindeditor的實(shí)現(xiàn)思路
本文主要詳細(xì)介紹下對(duì)GridView的行加顏色并彈出Kindeditor,感興趣的朋友可以了解下,希望可以幫助到你2013-04-04