在实际工作中,企业框架往往对Http请求和响应的body制定了一定的规范,这样每次编写Controller中Action方法时,有以下两个问题要解决:
- 都要解析请求报文以获取有用的参数
- 在返回时,根据规范去包装响应内容
为了减少工作量,我们可以编写一段通用的代码,在请求的时候对请求body进行解析,在响应的时候对body进行包装。
我这里采用的方式是在自己写Controller类上加一个自定义的特性[HttpMessageAttribute],这个特性继承自[ActionFilterAttribute],[ActionFilterAttribute]特性有以下几个常用的虚方法:
#region 程序集 Microsoft.AspNetCore.Mvc.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 #endregion //在Action执行之后调用 public virtual void OnActionExecuted(ActionExecutedContext context) { } //在Action执行之前调用 public virtual void OnActionExecuting(ActionExecutingContext context) { } //在Action执行之后调用(异步) [DebuggerStepThrough] public virtual Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { throw null; } //在执行Result后调用 public virtual void OnResultExecuted(ResultExecutedContext context) { } //在执行Result前调用 public virtual void OnResultExecuting(ResultExecutingContext context) { } //在执行Result前调用(异步) [DebuggerStepThrough] public virtual Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { throw null; }
我们通过override这些虚方法就可以在我们需要处理的时间点加入我们的代码进行相应处理。在这些虚方法中,都有一个类型为ActionExecutingContext的参数,这个参数存储的是当前的上下文,通过源码我们可以看到这个上下文对象有下面几个常用字段ActionArguments、Controller、Result,这三个字段中Result是支持读和写的,我正是将Result的内容进行包装解决问题2。解决问题1的思路则是根据ActionArguments获取请求报文然后进行转换赋值等。
以上所说的仅仅是对[ActionFilterAttribute]这个特性的一个小小的应用,以后有遇到更多适用的场景,希望能对你的工作起到帮助。
新手上路,欢迎指正。
来源:https://www.cnblogs.com/lilaogen/p/12553755.html