首先,以下方式是错误的(这个重复读取只能在using语句里面生效,因为用了ms对象赋值,当using结束后ms资源被释放,Request.Body就无法再读了)
        [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); //...
}
 

Asp.NetCore3.1 asp.net 5.0 中多次读取 Request.Body Ajax Post过来的JSON数据等 已验证有效的更多相关文章

  1. SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法

    最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@Respon ...

  2. PHP中ajax返回数据类型为JSON数据的处理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. ASP.NET Core 2.0 中读取 Request.Body 的正确姿势

    原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...

  4. Asp.NetCore3.1开源项目升级为.Net6.0

    概述 自从.Net6.0出来后,一直想之前开发的项目升级.Net6.0,有时想想毕竟中间还跨了个5.0版本,升级起来不知道坑大不大,最近抽时间对升级的方案做了些研究,然后将代码升级为.Net6.0.本 ...

  5. ASP.NET Core 中读取 Request.Body 的正确姿势

    ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream —— 不允许 Request.Body.Position=0 ,这就意味着只能 ...

  6. FineUI(开源版)v6.0中FState服务器端验证的实现原理

    前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...

  7. Android 7.0 中 ContentProvider 实现原理

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:汪毅雄 导语: 本文描述了ContentProvider发布者和调用者这两在Framework层是如何实现的. 作为Android的四大 ...

  8. Google中Gson的使用解析json数据-------学习篇

    之前写过一篇Gson解析json数据的基本应用,这里不多说,直接上例子. 有兴趣的可以先阅读下之前那篇,这里附上链接: http://www.cnblogs.com/Ant-soldier/p/632 ...

  9. 在java中像js那样处理json数据

    工作中经常需要通过ajax向前台返回json数据,都是通过拼字符串拼出来的,很发麻烦不说,还容易出错. 于是想,能不能像js那样操作json呢?或者说更方便的操作呢? Google的gson就是这样的 ...

  10. asp.netCore3.0 中使用app.UseMvc() 配置路由

    一.新配置路由策略  在 Asp.Net Core 3.0中默认不再支持app.UserMvc() 方式配置路由 系统. 而是使用新的模式,点击查看asp.netCore3.0区域和路由配置变化 默认 ...

随机推荐

  1. 【直播回顾】Hello HarmonyOS进阶课程第四课——ArkUI动画开发

    5 月 25 日晚上 19 点,由知名HarmonyOS开发领域的up主九弓子主讲的Hello HarmonyOS进阶系列应用篇第四课<ArkUI动画开发>,在众多HarmonyOS社群内 ...

  2. ArkUI开发趣味体验,快来抽取限量HarmonyOS专属头像!

    本次ArkUI开发趣味体验活动,将手把手教大家如何在IDE里实操一个ArkUI程序,通过补充缺失代码,成功运行程序开启抽奖功能,抽取个人专属头像,做HarmonyOS第一批数字藏品家! 同时本期提供的 ...

  3. 重新整理 .net core 实践篇————防跨站脚本攻击[四十]

    前言 简单整理一下跨站脚本攻击. 正文 攻击原理是这样子的: 这种攻击被攻击的面挺多的,比如说只要有一个可以让用户输入的注入脚本就都是一个问题. 给网站注入脚本 然后用户访问给网站注入的脚本 脚本里面 ...

  4. C/C++常考习题

    1.什么是虚函数?什么是纯虚函数? 虚函数:允许被其子类重新定义的成员函数. 虚函数的声明:virtual returntype func(parameter);引入虚函数的目的是为了动态绑定: 纯虚 ...

  5. 《c#高级编程》第2章C#2.0中的更改(一)——泛型

    一.实例 当我们需要编写一些通用的代码,但是不确定它们将处理的数据类型时,泛型就非常有用了.下面是一个简单的 C# 泛型示例: using System; public class Example { ...

  6. 力扣393(java)-UTF-8编码验证(中等)

    题目: 给定一个表示数据的整数数组 data ,返回它是否为有效的 UTF-8 编码. UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则: 对于 1 字节 的字符,字节的第一位设 ...

  7. DataFunTalk:阿里建设一站式实时数仓的经验分享

    简介: 本文内容整理于阿里资深技术专家姜伟华在DataFunTalk上的演讲,为大家介绍阿里巴巴基于一站式实时数仓Hologres建设实时数仓的经验和解决方案. 导读:大数据计算正从规模化走向实时化, ...

  8. 万字长文总结与剖析C语言关键字 -- <<C语言深度解剖>>

    C总结与剖析:关键字篇 -- <<C语言深度解剖>> 目录 C总结与剖析:关键字篇 -- <<C语言深度解剖>> 程序的本质:二进制文件 变量 1.变量 ...

  9. SpringBoot快速配置多数据源(整合MyBatis)

    前言 由于业务需求,需要同时在SpringBoot中配置两套数据源(连接两个数据库),要求能做到service层在调用各数据库表的mapper时能够自动切换数据源,也就是mapper自动访问正确的数据 ...

  10. 如何通过前后端交互的方式制作Excel报表

    前言 Excel拥有在办公领域最广泛的受众群体,以其强大的数据处理和可视化功能,成了无可替代的工具.它不仅可以呈现数据清晰明了,还能进行数据分析.图表制作和数据透视等操作,为用户提供了全面的数据展示和 ...