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

原来的是这样写的:
- if (filterContext.HttpContext.Request.Body.CanSeek)
 - {
 - filterContext.HttpContext.Request.EnableBuffering();
 - StreamReader fStreamReader = new StreamReader(filterContext.HttpContext.Request.Body);
 - fStreamReader.BaseStream.Position = 0;
 - var fBodyData = fStreamReader.ReadToEnd();
 - fStreamReader.BaseStream.Position = 0;
 - }
 
fBodyData一直为空,断点body发现stream长度为0,自然是无法读取到任何数据。在请求到达拦截器时Body已经被读取过了,此时在拦截器中使用EnableBuffering并没有起作用。也是奇怪,.net core 2.1还好好的,怎么突然就不行了。查了些资料,可以通过在Startup中添加如下代码解决:
- public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 - {
 - //省略其他代码
 - app.Use(next => context =>
 - {
 - context.Request.EnableBuffering();//启动倒带方式
 - return next(context);
 - });
 - //省略其他代码
 - }
 
而拦截器里则可以去掉EnableBuffering的调用了
- if (filterContext.HttpContext.Request.Body.CanSeek)
 - {
 - filterContext.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin);
 - var reader = new StreamReader(filterContext.HttpContext.Request.Body);
 - var fBodyData = reader.ReadToEndAsync().Result;
 - filterContext.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin);
 - }
 
测试了下,日志中终于又可以读取到body数据了。
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号