使用过 ASP.NET 的同学都知道,Filter 是一个非常中的概念,是项目开发过程中也是经常使用的。今天我们就来讲讲,通过Filter给 Request、Response 加点料。通过 Filter 处理 Request、Response 的应用场景有许多:对 token 业务上的验证、可以封装框架对 request 的基本验证等等。
接下来,通过简单的案例阐述今天要说的知识点,案例写的相对简单明白去原理即可,具体在工作中的使用,需要自己去结合实际业务
首先定义 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; }
}
定义 AddProduc 的 Request、Respons,并分别继承 BaseRequest、BaseResponse
public class AddProducRequest : BaseRequest
{
}
public class AddProductRespons : BaseResponse
{
public string Token { get; set; }
}
定义一个 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 };
}
}
定义一个 继承于 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);
}
}
builder.Services.AddMvc(opt =>
{
opt.Filters.Add(new RequestResponseHandleFilter());
});
可以看到,在 RequestResponseHandleFilter 中对 request token 的赋值处理是成功的,对 respons 中 msg 赋值处理也是成功的
https://download.csdn.net/download/weixin_46785144/85043694
开发者涨薪指南
48位大咖的思考法则、工作方式、逻辑体系
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_46785144/article/details/123774598
内容来源于网络,如有侵权,请联系作者删除!