美图齐众专注资阳网站设计 资阳网站制作 资阳网站建设
资阳网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

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

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

原来的是这样写的:

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

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

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

而拦截器里则可以去掉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数据了。


网页题目:记项目升级到.NET5.0后webapi请求拦截器的完善
网页路径:http://zsjierui.cn/article/cdhjgjc.html

其他资讯