请求大概是这样的:
前端以json字符串的形式把参数发到后台接口上,接口代码如下:
在后台Stream 流的形式把前端发过来的所有参数都接收到,但是全部是空,如上图。
请教大家 core webapi程序里,如何接收前端发来的json字符串参数(Content-Type:application/json)。
有朋友肯定想说可以遍历model的所有属性就是前端发来的参数了。这样不行,我本意是在异常过滤器里拿到系统抛错啥时的所有POST参数,这里面没有model对象。
在方法开始处加上 Request.EnableRewind()
试试,详见 ASP.NET Core 中读取 Request.Body 的正确姿势
我也猜到了流不让二次读取导致的,但是你提供的这个方法在我程序里不奏效?
我的环境是core 2.0啊,哪里出问题了。
好像是Action上标注了 [FromBody] 在模型绑定的时候 就已经把Stream给读了,在方法里面在设置:Request.EnableRewind()已经晚了。
这个Request.EnableRewind()可以在Startup里面设置吗?搞成全局的才实用,不可能每个方法里标注。
@oppoic: 既然已经从 Request.Body 中直接读了,为什么还要用 [FromBody] 进行模型绑定?
app.Use(next => context => { context.Request.EnableRewind(); return next(context); });
这个方法也用了,还是还是获取不到,全是空的字节数组。
https://stackoverflow.com/questions/31389781/read-request-body-twice/31395692
@dudu: 模型绑定是用于Action里面的逻辑,CRUD之类的。
有个额外的功能,如果程序报错,有个异常过滤器,我想在这个异常过滤器里把所有的POST参数都记录下来,这里需要读取流,这跟Action里面是两套逻辑。模型绑定是需要的,二次读取流也随时可能需要(程序抛错)
我现在就是想在异常过滤器里读取POST过来的参数(Content-Type:application/json),用不用流的方式读取都无所谓。
@oppoic: 在异常过滤器(ExceptionFilter)中添加下面的代码就可以了
context.HttpContext.Request.EnableRewind();
context.HttpContext.Request.Body.Seek(0, 0);
@oppoic: 上面的 Detail Action 读不到是由于没加 Request.Body.Seek(0, 0);
这个是我在做微信支付接收支付结果的代码片段
using (var ms = new MemoryStream()) { Request.Body.CopyTo(ms); var b = ms.ToArray(); var postParamsString = Encoding.UTF8.GetString(b); }