程序笔记   发布时间:2022-07-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用.NET 6开发TodoList应用(12)——实现ActionFilter大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

系列导航及源代码

  • 使用.NET 6开发TodoList应用文章索引

需求

Filter在.NET Web API项目开发中也是很重要的一个概念,它运行在执行MVC响应的Pipeline中执行,允许我们将一些可以在多个Action之间重用的逻辑抽取出来集中管理。然我们在上一篇使用.NET 6开发TodoList应用(11)——使用FluentValidation和MediatR实现接口请求验证中演示了如何通过使用MediatR提供的IPipelineBehavior接口在CQRS的Handle方法执行前后插入可重用代码,而本文所演示的Filters作用在Controller的Action执行或Action返回结果前后。

可以创建自定义Filters,用于处理应用程序中的横切片关注点。 横切片关注点的包括错误处理、缓存、配置、授权和日志记录。 Filters可以避免重复代码。

Filter的类型分为以下几种:

  • Authorization Filters:最先运行,用于确定是否已针对请求为用户授权。 如果请求未获授权,Authorization Filters可以让管道短路。

  • resource Filters:授权后运行。OnresourceExecuTing在Filter Pipeline的其余阶段之前运行代码。OnresourceExecuted在管道的其余阶段完成之后运行代码。可以用这个类型的Filter进行缓存和性能统计。

  • Action Filters:在调用操作方法之前和之后立即运行代码。它可以更改传递到操作中的参数,也可以更改从操作返回的结果,当然如果什么都不更改仅作记录也是可以的

  • Exception Filters:在向响应正文写入任何内容之前,对未经处理的异常应用全局策略。

  • Result Filters:在执行操作结果返回之前和之后运行代码。 仅当操作方法成功执行时,它们才会被运行。

这五种Filters在Filter Pipeline中直观的展现是这样的

使用.NET 6开发TodoList应用(12)——实现ActionFilter

而整个FIlter Pipeline在完整的Middleware Pipeline中的阶段是这样的

使用.NET 6开发TodoList应用(12)——实现ActionFilter

在本文中,我们将演示Action Filters是如何在Controller的Action执行前后记录请求和响应日志的。

目标

使用Action Filters进行接口日志记录。

原理与思路

创建一个自定义的Action Filter,用于实现Controller的接口日志逻辑。

实现

Api新建文件夹Filters并创建类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的参数值
        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项目,执行创建TodoList的请求:

  • 请求

    使用.NET 6开发TodoList应用(12)——实现ActionFilter

  • 响应

    • 来自于OnActionExecuTing的请求数据日志:

      使用.NET 6开发TodoList应用(12)——实现ActionFilter

      注意在我们上一篇文章中的Handling CreateTodoListCommand之前输出的内容。

    • 以及来自于OnActionExecuted输出的返回数据日志:

      使用.NET 6开发TodoList应用(12)——实现ActionFilter

一点扩展

关于Filter的主题还包含关于其作用域,优先级顺序以及如何调整优先级等,其他主题像如何改写响应,如何进行性能统计和缓存,我在这里暂时不做演示,可以参微软官方文档:ASP.NET Core 中的筛选器,进行更多了解。

总结

在本文中我们通过一个很简单的例子,演示了Action Filter的基本用法。至此我们关于请求中间件管道的讨论先告一个段落,后面说到认证鉴权的时候我们还会回来讨论这个主题。

从下一篇开始,我们集中来讨论查询操作中涉及的一些典型场景:包括分页、排序、过滤、搜索等。

资料

  1. ASP.NET Core 中的筛选器

大佬总结

以上是大佬教程为你收集整理的使用.NET 6开发TodoList应用(12)——实现ActionFilter全部内容,希望文章能够帮你解决使用.NET 6开发TodoList应用(12)——实现ActionFilter所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。