.Net Core 对于body多次读取,.net core2.0 使用EnableRewind(),.net core 3.0使用EnableBuffering(),该参数在第一次读取body之前开启,之后body信息可以多次读取;core时代取消了之前的stream.position=0写法,虽然var byts = new byte[request.ContentLength.Value]中的request.ContentLength.Value超过1024语法并没有错,但是对于流读取的话,一次最多是1024,如果一次需要读取的大于1024,也不会报错,会截断,就是读取的信息不全。这个是我在工作中对接ERP系统吸取的教训,搞了好久才发现内容被截断了,现在分享给大家,让你们少走点弯路。
一、错误写法
// 获取请求参数
var request = actionContext.HttpContext.Request;
request.EnableBuffering();
var stream = actionContext.HttpContext.Request.Body;
// 限制 读取 丢失
var byts = new byte[request.ContentLength.Value];
stream.Read(byts, 0, byts.Length);
var postJson = Encoding.UTF8.GetString(byts);
actionContext.HttpContext.Request.Body.Position = 0
二、正确写法
// 获取请求参数
var request = actionContext.HttpContext.Request;
request.EnableBuffering();
var postJson = "";
var stream = actionContext.HttpContext.Request.Body;
long? length = actionContext.HttpContext.Request.ContentLength;
if (length != null && length > 0)
{
// 使用这个方式读取,并且使用异步
StreamReader streamReader = new StreamReader(stream, Encoding.UTF8);
postJson = streamReader.ReadToEndAsync().Result;
}
actionContext.HttpContext.Request.Body.Position = 0
.NetCore中,若需多次读取HTTP请求Body,.netcore2.0使用EnableRewind(),.netcore3.0使用EnableBuffering()。文中详细对比了错误与正确读取Body的方法,指出了一次读取超过1024字节可能造成信息截断的问题,强调了使用异步方式读取Body的重要性。
&spm=1001.2101.3001.5002&articleId=105130489&d=1&t=3&u=d7d81724649c4077b524826168d1da19)
742

被折叠的 条评论
为什么被折叠?



