记项目升级到.NET 5.0后web api请求拦截器的完善
2023-03-14 09:32:50 时间
最近项目从.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数据了。
相关文章
- Go 语言短变量声明的“坑”
- 车祸现场!线上突然宕机,一条订单消息丢失了
- 使用人性化的 Linux 防火墙 CFW 阻止 DDOS 攻击
- 优雅的 React 源码调试方式
- 为地铁站构建一个智能停车系统
- 浅析面向过程、面向对象和面向协议编程
- Ultramarine Linux 37 版本发布
- Arch Linux 2023.01.01 版本 ISO 镜像发布:采用 Linux 内核 6.1
- 您应该了解的六个有用的 Bash Shell 变量
- 企业的四大自助式商业智能优势
- Linux的磁盘缓存和刷脏页
- 如何使用 Docker 部署 GitLab
- 太酷了!在浏览器中就能体验到功能齐全的终端
- 利用大数据制定最佳营销计划的创新方法
- Linux 中的 tree 命令
- IT科技生态的三代论
- 微软Windows 7和Windows 8.1 将在 1 月 10 日停止获取关键安全更新,Edge 浏览器 109 提供最后版本支持
- 代码越写越乱?那是因为你没用责任链
- 图数据科学深耕数据价值,推进企业数字化进程
- C语言中的volatile到底有什么用?