WebEnh

.net7 mvc jquery bootstrap json 学习中 第一次学PHP,正在研究中。自学进行时... ... 我的博客 https://enhweb.github.io/ 不错的皮肤:darkgreentrip,iMetro_HD
随笔 - 1079, 文章 - 1, 评论 - 75, 阅读 - 174万
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
首先,以下方式是错误的(这个重复读取只能在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);

            //...
        }
复制代码

 

 
编辑推荐:
· 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 支付宝接口开发-手机网站支付-沙箱测试
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

了解更多