Asp.NetCore3.1 asp.net 5.0 中多次读取 Request.Body Ajax Post过来的JSON数据等 已验证有效
首先,以下方式是错误的(这个重复读取只能在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数据等 已验证有效的更多相关文章
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@Respon ...
- PHP中ajax返回数据类型为JSON数据的处理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ASP.NET Core 2.0 中读取 Request.Body 的正确姿势
原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...
- Asp.NetCore3.1开源项目升级为.Net6.0
概述 自从.Net6.0出来后,一直想之前开发的项目升级.Net6.0,有时想想毕竟中间还跨了个5.0版本,升级起来不知道坑大不大,最近抽时间对升级的方案做了些研究,然后将代码升级为.Net6.0.本 ...
- ASP.NET Core 中读取 Request.Body 的正确姿势
ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream —— 不允许 Request.Body.Position=0 ,这就意味着只能 ...
- FineUI(开源版)v6.0中FState服务器端验证的实现原理
前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...
- Android 7.0 中 ContentProvider 实现原理
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:汪毅雄 导语: 本文描述了ContentProvider发布者和调用者这两在Framework层是如何实现的. 作为Android的四大 ...
- Google中Gson的使用解析json数据-------学习篇
之前写过一篇Gson解析json数据的基本应用,这里不多说,直接上例子. 有兴趣的可以先阅读下之前那篇,这里附上链接: http://www.cnblogs.com/Ant-soldier/p/632 ...
- 在java中像js那样处理json数据
工作中经常需要通过ajax向前台返回json数据,都是通过拼字符串拼出来的,很发麻烦不说,还容易出错. 于是想,能不能像js那样操作json呢?或者说更方便的操作呢? Google的gson就是这样的 ...
- asp.netCore3.0 中使用app.UseMvc() 配置路由
一.新配置路由策略 在 Asp.Net Core 3.0中默认不再支持app.UserMvc() 方式配置路由 系统. 而是使用新的模式,点击查看asp.netCore3.0区域和路由配置变化 默认 ...
随机推荐
- js中this对象的理解
一.定义 函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别 在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定) th ...
- 自动化部署脚本--一键部署单机版k8s
cat danjiDeploy_k8s.sh #!/bin/bash . /etc/init.d/functions # 版本 VERSION=v1.0.1 # IP地址,默认为本机第一块网卡IP地址 ...
- 力扣612(MySQL)-平面上的最近距离(中等)
题目: 表 point_2d 保存了所有点(多于 2 个点)的坐标 (x,y) ,这些点在平面上两两不重合.写一个查询语句找到两点之间的最近距离,保留 2 位小数. 最近距离在点 (-1,-1) 和( ...
- 力扣209(java&python)-长度最小的子数组(中等)
题目: 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, ...
- 如何避免 Go 命令行执行产生“孤儿”进程?
简介: 在 Go 程序当中,如果我们要执行命令时,通常会使用 exec.Command ,也比较好用,通常状况下,可以达到我们的目的,如果我们逻辑当中,需要终止这个进程,则可以快速使用 cmd.Pro ...
- 开发日志:企业微信实现扫码登录(WEB)
一:获取扫码登陆所需的参数:appid,secret,agentid 登录企业微信:https://work.weixin.qq.com/ 扫码登录文档:https://work.weixin.qq. ...
- 一款基于Vue3实现的漂亮且功能强大的在线海报设计器
大家好,我是 Java陈序员. 我们在工作中经常需要设计各种各样的图片,海报.产品图.文章图片.视频/公众号等. 我们可以选择使用 PS 来设计图片,但是有时候想快速完成任务,有没有一款工具支持快速生 ...
- Unity 热更--AssetBundle学习笔记 1.0【AB包资源加载工具类的实现】
工具类封装 通过上文中对AB包加载API的了解和简单使用,对AB包资源加载的几种方法进行封装,将其写入单例类中,如代码展示. 确保每个AB资源包只加载一次: 在LoadAssetBundleManag ...
- 一:大数据架构回顾-Lambda架构
"我们正在从IT时代走向DT时代(数据时代).IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好&q ...
- 【Python基础】两个参数的for循环步长写法
一个参数for循环步长写法 >>> for i in range(1,10000,1000):print(i) ... 1 1001 2001 3001 4001 5001 6001 ...