首页新闻招聘找找看知识库

asp.net core webapi 如何用 Stream 流的形式获取所有POST参数

0
悬赏园豆:40 [已解决问题] 解决于 2018-08-13 10:11

请求大概是这样的:

 

 

前端以json字符串的形式把参数发到后台接口上,接口代码如下:

 

在后台Stream 流的形式把前端发过来的所有参数都接收到,但是全部是空,如上图。

请教大家 core webapi程序里,如何接收前端发来的json字符串参数(Content-Type:application/json)。

有朋友肯定想说可以遍历model的所有属性就是前端发来的参数了。这样不行,我本意是在异常过滤器里拿到系统抛错啥时的所有POST参数,这里面没有model对象。

oppoic的主页 oppoic | 小虾三级 | 园豆:606
提问于:2018-08-10 16:47
< >
分享
最佳答案
0

在方法开始处加上 Request.EnableRewind() 试试,详见 ASP.NET Core 中读取 Request.Body 的正确姿势

收获园豆:40
dudu | 高人七级 |园豆:38764 | 2018-08-10 17:19

我也猜到了流不让二次读取导致的,但是你提供的这个方法在我程序里不奏效?

 

我的环境是core 2.0啊,哪里出问题了。

oppoic | 园豆:606 (小虾三级) | 2018-08-10 17:30

好像是Action上标注了 [FromBody] 在模型绑定的时候 就已经把Stream给读了,在方法里面在设置:Request.EnableRewind()已经晚了。

这个Request.EnableRewind()可以在Startup里面设置吗?搞成全局的才实用,不可能每个方法里标注。

oppoic | 园豆:606 (小虾三级) | 2018-08-10 17:34

@oppoic: 既然已经从 Request.Body 中直接读了,为什么还要用 [FromBody] 进行模型绑定?

dudu | 园豆:38764 (高人七级) | 2018-08-10 18:00
app.Use(next => context => { context.Request.EnableRewind(); return next(context); });

这个方法也用了,还是还是获取不到,全是空的字节数组。

https://stackoverflow.com/questions/31389781/read-request-body-twice/31395692

oppoic | 园豆:606 (小虾三级) | 2018-08-10 18:01

@dudu: 模型绑定是用于Action里面的逻辑,CRUD之类的。

有个额外的功能,如果程序报错,有个异常过滤器,我想在这个异常过滤器里把所有的POST参数都记录下来,这里需要读取流,这跟Action里面是两套逻辑。模型绑定是需要的,二次读取流也随时可能需要(程序抛错)

我现在就是想在异常过滤器里读取POST过来的参数(Content-Type:application/json),用不用流的方式读取都无所谓。

oppoic | 园豆:606 (小虾三级) | 2018-08-10 18:03

@oppoic: 在异常过滤器(ExceptionFilter)中添加下面的代码就可以了

context.HttpContext.Request.EnableRewind();
context.HttpContext.Request.Body.Seek(0, 0);
dudu | 园豆:38764 (高人七级) | 2018-08-10 18:34

@oppoic: 上面的 Detail Action 读不到是由于没加 Request.Body.Seek(0, 0);

dudu | 园豆:38764 (高人七级) | 2018-08-10 18:37
其他回答(1)
0

这个是我在做微信支付接收支付结果的代码片段

            using (var ms = new MemoryStream()) {
                Request.Body.CopyTo(ms);
                var b = ms.ToArray();
                var postParamsString = Encoding.UTF8.GetString(b);
            }
远扬 | 园豆:154 (初学一级) | 2018-08-11 18:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册