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区域和路由配置变化 默认 ...
随机推荐
- IP路由的工作原理
一.路由 路由在网络中起到什么作用? • 路由器负责将数据报文在IP网段之间进行转发 • 路由是指导路由器如何进行数据转发的路径信息 IP之间连通的前提是什么? • 沿途的每台路由器上都有到达目的网段 ...
- 重新点亮shell————awk数组[十四]
前言 简单介绍一下awk的数组. 正文 数组的定义: 数组的遍历: 删除数组: 例子: 例子2: 结 下一节awk函数.
- Web前端 -- NPM包管理器
初始化: #建立一个空文件夹,在命令提示符进入该文件夹 执行命令初始化 npm init #按照提示输入相关信息,如果是用默认值则直接回车即可. #name: 项目名称 #version: 项目版本号 ...
- 使用WebApi+Vue3从0到1搭建《权限管理系统》:二、搭建JWT系统鉴权
视频地址:[WebApi+Vue3从0到1搭建<权限管理系统>系列视频:搭建JWT系统鉴权-哔哩哔哩] https://b23.tv/R6cOcDO qq群:801913255 一.在ap ...
- asyncio async和await列表推导式实现异步高并发执行
import asyncio import random import time # 需求:有一个crontab调度器,每隔1秒,拉起1个job,要求这些job可以并发爬取网页 async def c ...
- Kafka 的分片和副本机制
我们在使用 Kafka 生产和消费消息的时候,肯定是希望能够将数据均匀地分配到所有服务器上.比如在日志收集场景,数据量是非常巨大的,例如大批量的集群每分钟产生的日志都能以 GB 计,所以如何将这么大的 ...
- Oracle 存储包死锁杀进程操作
Oracle 存储包死锁杀进程操作 突然想起来,正好记一份 首先查询锁包的情况 select distinct session_id from dba_ddl_locks where name=upp ...
- EMT4J——让 Java 应用升级更轻松
简介: EMT4J 是什么?如何使用 EMT4J 工具进行 Java 应用升级? 前言 JDK 升级对于 Java 应用来说是不得不面对的事情,一方面 Java 生态系统希望 Java 应用能跟上最新 ...
- Flink SQL 性能优化:multiple input 详解
简介: 在 Flink 1.12 中,针对目前 operator chaining 无法覆盖的场景,推出了 multiple input operator 与 source chaining 优化.该 ...
- 深入解读 Flink SQL 1.13
简介: Apache Flink 社区 5 月 22 日北京站 Meetup 分享内容整理,深入解读 Flink SQL 1.13 中 5 个 FLIP 的实用更新和重要改进. 本文由社区志愿者陈政羽 ...