通过Filter给Request、Response加点料

x33g5p2x  于2022-06-06 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(452)

一、简介

使用过 ASP.NET 的同学都知道,Filter 是一个非常中的概念,是项目开发过程中也是经常使用的。今天我们就来讲讲,通过Filter给 Request、Response 加点料。通过 Filter 处理 Request、Response 的应用场景有许多:对 token 业务上的验证、可以封装框架对 request 的基本验证等等。

二、案例

接下来,通过简单的案例阐述今天要说的知识点,案例写的相对简单明白去原理即可,具体在工作中的使用,需要自己去结合实际业务

2.1 BaseClass

首先定义 BaseRequest、BaseResponse 两个基类,这个会被 API 的 Request、Respons 继承,其次也会在 Filter 中做类型判断被使用。其实继不继承都可以,直接使用 API Request、Respons 也可以,这样会不利于代码维护,通常都是在共性基类中做。

public class BaseRequest
{
    public string Token { get; set; }
}

public class BaseResponse
{
    public string Msg { get; set; }
}

2.2 Request Respons

定义 AddProduc 的 Request、Respons,并分别继承 BaseRequest、BaseResponse

public class AddProducRequest : BaseRequest
{
}

public class AddProductRespons : BaseResponse
{
    public string Token { get; set; }
}

2.3 Controller

定义一个 Post 方式的 API 入参、出参分别是 AddProducRequest 、AddProductRespons。这样为了演示功能原理,所以将 token 进行传递。

[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    [HttpPost]
    [Route("AddProduc")]
    public AddProductRespons AddProduc([FromBody] AddProducRequest request)
    {
        return new AddProductRespons() { Token = request?.Token };
    }
}

2.4 RequestResponseHandleFilter

定义一个 继承于 ActionFilterAttribute 的 RequestResponseHandleFilter ,在 OnActionExecutionAsync 方法处理 action 的 request ,在 OnResultExecutionAsync 处理 action 的 respons

public class RequestResponseHandleFilter : ActionFilterAttribute
{
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var baseRequest = context.ActionArguments?.FirstOrDefault().Value as BaseRequest;

        if (baseRequest != null)
        {
            baseRequest.Token = Guid.NewGuid().ToString();
        }

        await next();
    }

    public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
    {
        if (context.Result is ObjectResult objResult && objResult?.Value is BaseResponse baseResponse)
        {
            baseResponse.Msg = "我在 filter 中被赋值";
        }

        await base.OnResultExecutionAsync(context, next);
    }
}

2.5 注册 Filter

builder.Services.AddMvc(opt =>
{
    opt.Filters.Add(new RequestResponseHandleFilter());
});

2.6 启动演示

可以看到,在 RequestResponseHandleFilter 中对 request token 的赋值处理是成功的,对 respons 中 msg 赋值处理也是成功的

三、源码

https://download.csdn.net/download/weixin_46785144/85043694

开发者涨薪指南

48位大咖的思考法则、工作方式、逻辑体系

相关文章