最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)ActionFilter

 更新時(shí)間:2021年12月31日 08:53:56   作者:CODE4NOTHING  
Filter在.NET Web API項(xiàng)目開發(fā)中也是很重要的一個(gè)概念,它運(yùn)行在執(zhí)行MVC響應(yīng)的Pipeline中執(zhí)行,允許我們將一些可以在多個(gè)Action之間重用的邏輯抽取出來集中管理。本文將詳細(xì)介紹一下.NET 6如何實(shí)現(xiàn)ActionFilter,感興趣的可以學(xué)習(xí)一下

需求

Filter在.NET Web API項(xiàng)目開發(fā)中也是很重要的一個(gè)概念,它運(yùn)行在執(zhí)行MVC響應(yīng)的Pipeline中執(zhí)行,允許我們將一些可以在多個(gè)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)的包括錯(cuò)誤處理、緩存、配置、授權(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)行代碼。可以用這個(gè)類型的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í)行時(shí),它們才會(huì)被運(yùn)行。

這五種Filters在Filter Pipeline中直觀的展現(xiàn)是這樣的:

而整個(gè)FIlter Pipeline在完整的Middleware Pipeline中的階段是這樣的:

在本文中,我們將演示Action Filters是如何在Controller的Action執(zhí)行前后記錄請求和響應(yīng)日志的。

目標(biāo)

使用Action Filters進(jìn)行接口日志記錄。

原理與思路

創(chuàng)建一個(gè)自定義的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)證

啟動(dòng)Api項(xiàng)目,執(zhí)行創(chuàng)建TodoList的請求:

請求

響應(yīng)

來自于OnActionExecuting的請求數(shù)據(jù)日志:

注意在我們上一篇文章中的Handling CreateTodoListCommand之前輸出的內(nèi)容。

以及來自于OnActionExecuted輸出的返回?cái)?shù)據(jù)日志:

總結(jié)

在本文中我們通過一個(gè)很簡單的例子,演示了Action Filter的基本用法。至此我們關(guān)于請求中間件管道的討論先告一個(gè)段落,后面說到認(rèn)證鑒權(quán)的時(shí)候我們還會(huì)回來討論這個(gè)主題。?

到此這篇關(guān)于.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)ActionFilter的文章就介紹到這了,更多相關(guān).NET 6實(shí)現(xiàn)ActionFilter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

辽源市| 固原市| 井研县| 宕昌县| 沙湾县| 清远市| 桓台县| 鹿泉市| 凯里市| 浦北县| 科尔| 垫江县| 普陀区| 科尔| 类乌齐县| 汶上县| 石阡县| 香港 | 夏津县| 无为县| 钟山县| 香格里拉县| 榆林市| 邻水| 简阳市| 沧州市| 扎鲁特旗| 新疆| 错那县| 定西市| 临城县| 长顺县| 拉孜县| 保亭| 高青县| 盐源县| 淮滨县| 铁岭市| 庐江县| 静安区| 萍乡市|