首先,以下方式是错误的(这个重复读取只能在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. Prometheus之grafana(No data to show)

    一.问题现象 1.grafana添加数据源后获取不到监控数据(No data to show) 2.prometheus以下报错 二.问题原因 服务器与浏览器时间不同步的原因,服务器端配置NTP服务和 ...

  2. IntelliJ IDEA 配置类注释模板

    菜单栏依次点击 File > Settings 在弹出窗口中找到 Editor >File and Code Templates 在右侧中 Files 选项卡中找到 Class. 在右侧输 ...

  3. Access Single User Mode (Reset Root Password)--CentOS 修改root密码

    Access Single User Mode (Reset Root Password) Published on: Wed, Sep 17, 2014 at 12:52 pm EST FAQ  L ...

  4. CentOS 防火墙配置实战精要

    防火墙是服务器最重要的安全屏障,正确的操作对应用也是非常非常关键,本文参考了一些实战经验并经过实验验证,集众家之长做了简单的归纳整理,希望能帮助你更好地操作防火墙. 设置CentOS防火墙开放端口 在 ...

  5. vue3.0 中文文档(暂时)地址

    https://v3.cn.vuejs.org/ https://vue-docs-next-zh-cn.netlify.app/guide/installation.html#vue-devtool ...

  6. Go语言打印九九乘法表,这是整洁代码范例

    Go语言打印九九乘法表,这是整洁代码范例 / Go 语言输出九九乘法表 / 九九乘法表是我们学习编程时的一项基本练习,它看似简单,通过实现输出九九乘法表可以加深对 Go 语言循环结构的理解和运用. 本 ...

  7. 力扣595(MySQL)-大的国家(简单)

    题目: World 表: 如果一个国家满足下述两个条件之一,则认为该国是 大国 : 面积至少为 300 万平方公里(即,3000000 km2),或者人口至少为 2500 万(即 25000000)编 ...

  8. 力扣81(java&python)-搜索旋转排序数组 II(中等)

    题目: 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 ...

  9. 力扣537(java)-复数乘法(中等)

    题目: 复数 可以用字符串表示,遵循 "实部+虚部i" 的形式,并满足下述条件: 实部 是一个整数,取值范围是 [-100, 100]虚部 也是一个整数,取值范围是 [-100, ...

  10. RocketMQ 消息集成:多类型业务消息-普通消息

    简介: 本篇将从业务集成场景的诉求开始,介绍 RocketMQ 作为业务消息集成方案的核心能力和优势,通过功能场景.应用案例以及最佳实践等角度介绍 RocketMQ 普通消息类型的使用. 引言 Apa ...