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内容发现会报错 代码如下:
翻译过来也就是说 “同步操作被拒绝,可以调用异步方法,或者设置允许同步IO”,这里就给了两个方案,异步,或者设置允许同步IO。不过经过尝试发现,调用异步方法不会报错,但是获取不到参数内容。
那么最后 尝试设置允许同步IO,经折腾,发现确实可行,步骤如下:
- 在Startup.Configure 请求管道配置中 启用EnableBuffering
2. 在Startip.ConfigureServices 服务配置中 设置同步请求读取流数据
3. 过滤器中 同步方法读取body 参数
以上Thanks♪(・ω・)ノ
参考原文:
https://www.yesdotnet.com/archive/post/1622026194.html
https://www.cnblogs.com/personblog/p/13259732.html



浙公网安备 33010602011771号