.NET 6開發(fā)TodoList應用之實現(xiàn)ActionFilter
需求
Filter在.NET Web API項目開發(fā)中也是很重要的一個概念,它運行在執(zhí)行MVC響應的Pipeline中執(zhí)行,允許我們將一些可以在多個Action之間重用的邏輯抽取出來集中管理。雖然我們在上一篇使用.NET 6開發(fā)TodoList應用之實現(xiàn)接口請求驗證中演示了如何通過使用MediatR提供的IPipelineBehavior接口在CQRS的Handle方法執(zhí)行前后插入可重用代碼,而本文所演示的Filters作用在Controller的Action執(zhí)行或Action返回結果前后。
可以創(chuàng)建自定義Filters,用于處理應用程序中的橫切片關注點。 橫切片關注點的包括錯誤處理、緩存、配置、授權和日志記錄。 Filters可以避免重復代碼。
Filter的類型分為以下幾種:
Authorization Filters
:最先運行,用于確定是否已針對請求為用戶授權。 如果請求未獲授權,Authorization Filters可以讓管道短路。
Resource Filters
:授權后運行。OnResourceExecuting在Filter Pipeline的其余階段之前運行代碼。OnResourceExecuted在管道的其余階段完成之后運行代碼??梢杂眠@個類型的Filter進行緩存和性能統(tǒng)計。
Action Filters
:在調用操作方法之前和之后立即運行代碼。它可以更改傳遞到操作中的參數(shù),也可以更改從操作返回的結果,當然如果什么都不更改僅作記錄也是可以的。
Exception Filters
:在向響應正文寫入任何內(nèi)容之前,對未經(jīng)處理的異常應用全局策略。
Result Filters
:在執(zhí)行操作結果返回之前和之后運行代碼。 僅當操作方法成功執(zhí)行時,它們才會被運行。
這五種Filters在Filter Pipeline中直觀的展現(xiàn)是這樣的:
而整個FIlter Pipeline在完整的Middleware Pipeline中的階段是這樣的:
在本文中,我們將演示Action Filters是如何在Controller的Action執(zhí)行前后記錄請求和響應日志的。
目標
使用Action Filters進行接口日志記錄。
原理與思路
創(chuàng)建一個自定義的Action Filter,用于實現(xiàn)Controller的接口日志邏輯。
實現(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轉換為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>();
在需要應用該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)); }
驗證
啟動Api項目,執(zhí)行創(chuàng)建TodoList的請求:
請求
響應
來自于OnActionExecuting的請求數(shù)據(jù)日志:
注意在我們上一篇文章中的Handling CreateTodoListCommand之前輸出的內(nèi)容。
以及來自于OnActionExecuted輸出的返回數(shù)據(jù)日志:
總結
在本文中我們通過一個很簡單的例子,演示了Action Filter的基本用法。至此我們關于請求中間件管道的討論先告一個段落,后面說到認證鑒權的時候我們還會回來討論這個主題。?
到此這篇關于.NET 6開發(fā)TodoList應用之實現(xiàn)ActionFilter的文章就介紹到這了,更多相關.NET 6實現(xiàn)ActionFilter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- .NET 6開發(fā)TodoList應用之實現(xiàn)查詢分頁
- .NET 6開發(fā)TodoList應用之實現(xiàn)接口請求驗證
- .NET?6開發(fā)TodoList應用之實現(xiàn)DELETE請求與HTTP請求冪等性
- .NET 6開發(fā)TodoList應用之實現(xiàn)PUT請求
- .NET 6開發(fā)TodoList應用之實現(xiàn)全局異常處理
- .NET 6開發(fā)TodoList應用之使用AutoMapper實現(xiàn)GET請求
- .NET?6開發(fā)TodoList應用之實現(xiàn)Repository模式
- .NET?6開發(fā)TodoList應用之使用MediatR實現(xiàn)POST請求
- .NET 6開發(fā)TodoList應用引入數(shù)據(jù)存儲
- .NET?6開發(fā)TodoList應用引入第三方日志庫
- .NET 6開發(fā)TodoList應用實現(xiàn)結構搭建
- .NET?6開發(fā)TodoList應用實現(xiàn)系列背景
- 使用.NET?6開發(fā)TodoList應用之引入數(shù)據(jù)存儲的思路詳解
- 使用.NET?6開發(fā)TodoList應用之領域實體創(chuàng)建原理和思路
- .NET?6開發(fā)TodoList應用之請求日志組件HttpLogging介紹
相關文章
aspx中的mysql操作類sqldatasource使用示例分享
服務器裝了mysql odbc驅動,想在那個iis上操作另一個服務器的mysql,找到個.net的sqldatasource類可以操作mysql,下在把使用方法分享一下2014-01-01Asp.net core利用dynamic簡化數(shù)據(jù)庫訪問
這篇文章介紹了Asp.net core利用dynamic簡化數(shù)據(jù)庫訪問的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07ASP.NET 2.0下隨機讀取Access記錄的實現(xiàn)方法
ASP.NET 2.0下隨機讀取Access記錄的實現(xiàn)方法...2007-03-03利用ASP.NET MVC+Bootstrap搭建個人博客之修復UEditor編輯時Bug(四)
這篇文章主要介紹了利用ASP.NET MVC+Bootstrap搭建個人博客之修復UEditor編輯時Bug(四)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06MVC默認路由實現(xiàn)分頁(PagerExtend.dll下載)
這篇文章主要介紹了MVC默認路由實現(xiàn)分頁,采用bootstrap的樣式,文末提供了PagerExtend.dll下載地址,感興趣的小伙伴們可以參考一下2016-07-07