Asp.NetCore3.1 asp.net 5.0 中多次读取 Request.Body Ajax Post过来的JSON数据等 已验证有效
Posted on 2020-06-13 02:26 WebEnh 阅读(598) 评论(0) 编辑 收藏 举报首先,以下方式是错误的(这个重复读取只能在using语句里面生效,因为用了ms对象赋值,当using结束后ms资源被释放,Request.Body就无法再读了)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | [HttpPost] public async Task< string > Post() { //StreamReader sr = new StreamReader(Request.Body); //string data = await sr.ReadToEndAsync(); string data = "" ; using (MemoryStream ms = new MemoryStream()) { await Request.Body.CopyToAsync(ms); //设置当前流的位置为0 ms.Seek(0, SeekOrigin.Begin); logger.LogInformation( "ms.Length=" + ms.Length); //这里ReadToEnd执行完毕后requestBodyStream流的位置会从0到最后位置(即request.ContentLength) data = new StreamReader(ms, Encoding.UTF8).ReadToEnd(); logger.LogInformation( "data=" + data); //设置当前流的位置为0 ms.Seek(0, SeekOrigin.Begin); Request.Body = ms; StreamReader sr = new StreamReader(Request.Body); string data2 = await sr.ReadToEndAsync(); logger.LogInformation( "data2=" + data2); } string header = $ "请求头:\r\n" ; foreach ( var item in Request.Headers) { header += $ "{item.Key}:{item.Value}\r\n" ; } logger.LogInformation(header); var ip = Request.Headers[ "X-Forwarded-For" ].FirstOrDefault(); if ( string .IsNullOrEmpty(ip)) { //ip = Request.HttpContext.Connection.RemoteIpAddress.ToString(); //ip = Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString(); ip = Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); } logger.LogInformation( "ip=" + ip); //... } |
正确方式是:
[HttpPost] public async Task<string> Post() { //StreamReader sr = new StreamReader(Request.Body); //string data = await sr.ReadToEndAsync(); string data = ""; //Request.EnableBuffering();可以实现多次读取Body Request.EnableBuffering(); StreamReader sr = new StreamReader(Request.Body); data = await sr.ReadToEndAsync(); logger.LogInformation("data=" + data); Request.Body.Seek(0, SeekOrigin.Begin); //再次读取 依然可以成功读到 Request.EnableBuffering(); StreamReader sr2 = new StreamReader(Request.Body); string data2 = await sr2.ReadToEndAsync(); logger.LogInformation("data2=" + data2); Request.Body.Seek(0, SeekOrigin.Begin); string header = $"请求头:\r\n"; foreach (var item in Request.Headers) { header += $"{item.Key}:{item.Value}\r\n"; } logger.LogInformation(header); var ip = Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) { //ip = Request.HttpContext.Connection.RemoteIpAddress.ToString(); //ip = Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString(); ip = Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); } logger.LogInformation("ip=" + ip); //... }
转自:http://Www.CnBlogs.Com/WebEnh/
如果想下次快速找到我,记得点下面的关注哦!
本博客Android APP 下载 |
![]() |
支持我们就给我们点打赏 |
![]() |
支付宝打赏 支付宝扫一扫二维码 |
![]() |
微信打赏 微信扫一扫二维码 |
![]() |
如果想下次快速找到我,记得点下面的关注哦!
分类:
.Net Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2019-06-13 WebSocket Client连接AspNetCore SignalR Json Hub
2018-06-13 Dapper结合Repository模式的应用
2018-06-13 项目架构开发:数据访问层之Repository
2017-06-13 [支付宝]手机网站支付快速接入
2017-06-13 支付宝 app支付 沙盘使用
2017-06-13 支付宝接口开发-手机网站支付-沙箱测试