当前位置: 首页 > 科技观察

还记得项目升级到.NET5.0后对webapi请求拦截器的完善

时间:2023-03-22 15:21:02 科技观察

最近项目直接从.netcore2.1升级到.net5.0,发现需要改很多代码,包括原始的webapi请求拦截器读取Body数据。原文是这样写的:if(filterContext.HttpContext.Request.Body.CanSeek){filterContext.HttpContext.Request.EnableBuffering();StreamReaderfStreamReader=newStreamReader(filterContext.HttpContext.Request.Body);fStreamReader.BaseStream.Position=0;varfBodyData=fStreamReader.ReadToEnd();fStreamReader.BaseStream.Position=0;}fBodyData一直为空,断点body发现stream的长度为0,自然就读不到数据了。当请求到达拦截器时,Body已经被读取,此时在拦截器中使用EnableBuffering不起作用。也奇怪,.netcore2.1好好的,怎么突然就不行了。查了一些资料,在Startup中加入如下代码即可解决:publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){//省略其他代码app.Use(next=>context=>{context.Request.EnableBuffering();//StartupBeltmodereturnnext(context);});//省略其他代码}在拦截器中,可以去掉EnableBuffering的调用if(filterContext.HttpContext.Request.Body.CanSeek){filterContext.HttpContext.Request.Body.Seek(0,SeekOrigin.Begin);varreader=newStreamReader(filterContext.HttpContext.Request.Body);varfBodyData=reader.ReadToEndAsync().Result;filterContext.HttpContext.Request.Body.Seek(0,SeekOrigin.Begin);}tested接下来终于可以再次在log中读取body数据了。