網(wǎng)站首頁 編程語言 正文
.NET?6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)ActionFilter_實(shí)用技巧
作者:CODE4NOTHING ? 更新時間: 2022-03-21 編程語言需求
Filter在.NET Web API項(xiàng)目開發(fā)中也是很重要的一個概念,它運(yùn)行在執(zhí)行MVC響應(yīng)的Pipeline中執(zhí)行,允許我們將一些可以在多個Action之間重用的邏輯抽取出來集中管理。雖然我們在上一篇使用.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)接口請求驗(yàn)證中演示了如何通過使用MediatR提供的IPipelineBehavior接口在CQRS的Handle方法執(zhí)行前后插入可重用代碼,而本文所演示的Filters作用在Controller的Action執(zhí)行或Action返回結(jié)果前后。
可以創(chuàng)建自定義Filters,用于處理應(yīng)用程序中的橫切片關(guān)注點(diǎn)。 橫切片關(guān)注點(diǎn)的包括錯誤處理、緩存、配置、授權(quán)和日志記錄。 Filters可以避免重復(fù)代碼。
Filter的類型分為以下幾種:
Authorization Filters
:最先運(yùn)行,用于確定是否已針對請求為用戶授權(quán)。 如果請求未獲授權(quán),Authorization Filters可以讓管道短路。
Resource Filters
:授權(quán)后運(yùn)行。OnResourceExecuting在Filter Pipeline的其余階段之前運(yùn)行代碼。OnResourceExecuted在管道的其余階段完成之后運(yùn)行代碼。可以用這個類型的Filter進(jìn)行緩存和性能統(tǒng)計(jì)。
Action Filters
:在調(diào)用操作方法之前和之后立即運(yùn)行代碼。它可以更改傳遞到操作中的參數(shù),也可以更改從操作返回的結(jié)果,當(dāng)然如果什么都不更改僅作記錄也是可以的。
Exception Filters
:在向響應(yīng)正文寫入任何內(nèi)容之前,對未經(jīng)處理的異常應(yīng)用全局策略。
Result Filters
:在執(zhí)行操作結(jié)果返回之前和之后運(yùn)行代碼。 僅當(dāng)操作方法成功執(zhí)行時,它們才會被運(yùn)行。
這五種Filters在Filter Pipeline中直觀的展現(xiàn)是這樣的:
而整個FIlter Pipeline在完整的Middleware Pipeline中的階段是這樣的:
在本文中,我們將演示Action Filters是如何在Controller的Action執(zhí)行前后記錄請求和響應(yīng)日志的。
目標(biāo)
使用Action Filters進(jìn)行接口日志記錄。
原理與思路
創(chuàng)建一個自定義的Action Filter,用于實(shí)現(xiàn)Controller的接口日志邏輯。
實(shí)現(xiàn)
在Api新建文件夾Filters并創(chuàng)建類LogFilterAttribute:
LogFilterAttribute.cs
using System.Text.Json; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; namespace TodoList.Api.Filters; public class LogFilterAttribute : IActionFilter { private readonly ILogger<LogFilterAttribute> _logger; public LogFilterAttribute(ILogger<LogFilterAttribute> logger) => _logger = logger; public void OnActionExecuting(ActionExecutingContext context) { var action = context.RouteData.Values["action"]; var controller = context.RouteData.Values["controller"]; // 獲取名稱包含Command的參數(shù)值 var param = context.ActionArguments.SingleOrDefault(x => x.Value.ToString().Contains("Command")).Value; _logger.LogInformation($"Controller:{controller}, action: {action}, Incoming request: {JsonSerializer.Serialize(param)}"); } public void OnActionExecuted(ActionExecutedContext context) { var action = context.RouteData.Values["action"]; var controller = context.RouteData.Values["controller"]; // 需要先將Result轉(zhuǎn)換為ObjectResult類型才能拿到Value值 var result = (ObjectResult)context.Result!; _logger.LogInformation($"Controller:{controller}, action: {action}, Executing response: {JsonSerializer.Serialize(result.Value)}"); } }
依賴注入:
Program.cs
builder.Services.AddScoped<LogFilterAttribute>();
在需要應(yīng)用該Filter的Controller Action上添加屬性:
TodoListController.cs
[HttpPost] [ServiceFilter(typeof(LogFilterAttribute))] public async Task<ApiResponse<Domain.Entities.TodoList>> Create([FromBody] CreateTodoListCommand command) { return ApiResponse<Domain.Entities.TodoList>.Success(await _mediator.Send(command)); }
驗(yàn)證
啟動Api項(xiàng)目,執(zhí)行創(chuàng)建TodoList的請求:
請求
響應(yīng)
來自于OnActionExecuting的請求數(shù)據(jù)日志:
注意在我們上一篇文章中的Handling CreateTodoListCommand之前輸出的內(nèi)容。
以及來自于OnActionExecuted輸出的返回?cái)?shù)據(jù)日志:
總結(jié)
在本文中我們通過一個很簡單的例子,演示了Action Filter的基本用法。至此我們關(guān)于請求中間件管道的討論先告一個段落,后面說到認(rèn)證鑒權(quán)的時候我們還會回來討論這個主題。?
原文鏈接:https://www.cnblogs.com/code4nothing/p/15745788.html
相關(guān)推薦
- 2022-08-04 使用systemd部署服務(wù)的過程解析_python
- 2022-09-20 RecyclerView實(shí)現(xiàn)側(cè)滑和網(wǎng)絡(luò)斷點(diǎn)續(xù)傳_Android
- 2023-06-18 聚星C#數(shù)字信號處理工具包頻譜分析的用法_C#教程
- 2022-10-30 C++解析obj模型文件方法介紹_C 語言
- 2022-12-12 C語言使用函數(shù)實(shí)現(xiàn)字符串部分復(fù)制問題_C 語言
- 2022-03-28 Python?pandas之多級索引取值詳解_python
- 2022-09-15 python實(shí)現(xiàn)簡單的計(jì)算器功能_python
- 2022-10-22 Python中的list.sort()方法和函數(shù)sorted(list)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支