NetCore3.1 ActionFilter过滤器中获取接口参数的正确姿势

     最近公司的WebApi项目需要支持多级缓存,达到减轻服务器压力的作用。准备从ActionFilter过滤器下手,把接口返回信息进行缓存,存储介质使用流行的Redis。由于之前做过NetCore2.1 类似的需求,所以就直接下手撸代码了,结果还是遇上了不少坑,Redis缓存需要先确定key,key可以自定义或者直接用ControllerName+ActionName+Params 进行拼接(需要确保key在范围内唯一),就在获取接口参数这里NetCore3.1版本发生了很大变化,导致前后折腾了两天才搞定,一下做个总结,帮铁子们少走些弯路。

一,针对 Get请求

       get请求大家都知道,参数拼接在URL上,服务端 直接使用 QueryString 即可

string method = context.HttpContext.Request.Method.ToUpper();
            if (method == "GET")
            {
                string s= $"mesapicache_{keyname}_{context.HttpContext.Request.QueryString.Value.ToMD5String()}";
                return s;
            }


二,POST请求

      由于NetCore3.1 请求上下文中取消了Form属性,参数信息都放在了 Body 里边。微软默认限制了POST请求参数只能读取一次,如果要在过滤器中多次读取需要设置开启多次读取,NetCore2.1 的时候 用Request.EnableRewind(); 到了3.1 换成了 Request.EnableBuffering()。

      设置好允许多次读取body后,直接同步读取Body内容发现会报错 代码如下:

image

1650596287

     翻译过来也就是说 “同步操作被拒绝,可以调用异步方法,或者设置允许同步IO”,这里就给了两个方案,异步,或者设置允许同步IO。不过经过尝试发现,调用异步方法不会报错,但是获取不到参数内容。


     那么最后 尝试设置允许同步IO,经折腾,发现确实可行,步骤如下:

  1.      在Startup.Configure 请求管道配置中 启用EnableBuffering

image 

     2.     在Startip.ConfigureServices 服务配置中 设置同步请求读取流数据

image

     3.     过滤器中 同步方法读取body 参数

image


    以上Thanks♪(・ω・)ノ


参考原文:

https://www.yesdotnet.com/archive/post/1622026194.html

https://www.cnblogs.com/personblog/p/13259732.html




posted @ 2022-04-22 11:30  wyzjuny  阅读(1709)  评论(4)    收藏  举报