当前位置:主页 > 查看内容

记项目升级到.NET 5.0后web api请求拦截器的完善

发布时间:2021-05-18 00:00| 位朋友查看

简介:最近项目从.net core 2.1直接升级到.net 5.0,发现很多代码需要改动,其中就涉及到原来的web api请求拦截器的中Body数据的读……

最近项目从.net core 2.1直接升级到.net 5.0,发现很多代码需要改动,其中就涉及到原来的web api请求拦截器的中Body数据的读取。

原来的是这样写的:

  1. if (filterContext.HttpContext.Request.Body.CanSeek) 
  2.   filterContext.HttpContext.Request.EnableBuffering(); 
  3.   StreamReader fStreamReader = new StreamReader(filterContext.HttpContext.Request.Body); 
  4.   fStreamReader.BaseStream.Position = 0; 
  5.   var fBodyData = fStreamReader.ReadToEnd(); 
  6.   fStreamReader.BaseStream.Position = 0; 

fBodyData一直为空,断点body发现stream长度为0,自然是无法读取到任何数据。在请求到达拦截器时Body已经被读取过了,此时在拦截器中使用EnableBuffering并没有起作用。也是奇怪,.net core 2.1还好好的,怎么突然就不行了。查了些资料,可以通过在Startup中添加如下代码解决:

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
  2.   //省略其他代码 
  3.   app.Use(next => context => 
  4.           { 
  5.     context.Request.EnableBuffering();//启动倒带方式 
  6.     return next(context); 
  7.   }); 
  8.   //省略其他代码 

而拦截器里则可以去掉EnableBuffering的调用了

  1. if (filterContext.HttpContext.Request.Body.CanSeek) 
  2.  { 
  3.    filterContext.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin); 
  4.    var reader = new StreamReader(filterContext.HttpContext.Request.Body); 
  5.    var fBodyData = reader.ReadToEndAsync().Result; 
  6.    filterContext.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin); 
  7.  } 

测试了下,日志中终于又可以读取到body数据了。

【责任编辑:未丽燕 TEL:(010)68476606】
本文转载自网络,原文链接:https://www.toutiao.com/a6932478427349991943/
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐