ASP.Net Core读取Http请求正文的一种方法

由于ASP.Net Core在3.0版本中禁用了同步读取Request.Body,所以会引发异常,网上大多数教程都是如何将禁用同步读取流的选项重新启用,由于微软的官方文档中已经警告了同步读取Request.Body会引发内存泄漏,所以需要用推荐的方式读取Request.Body,也就是使用PipeReader来读取,下面封装了一个方法和一个示例供参考:

复制代码
        /// <summary>
        /// 获取请求正文
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        [NonAction]
        private async Task<string> GetRequestBodyAsync(HttpRequest request, CancellationToken token)
        {

        if (!request.Body.CanSeek)
        {
          request.EnableBuffering();
        }


        request.Body.Seek(0, SeekOrigin.Begin);


        using StreamReader reader = new StreamReader(request.Body, Encoding.UTF8);


        var body = await reader.ReadToEndAsync(token);


        request.Body.Seek(0, SeekOrigin.Begin);


        return body;

        }
复制代码

使用示例:

复制代码
        [HttpPost]
        public async Task<IActionResult> TestAction()
        {
            string content = await GetRequestBodyAsync(
                Request, HttpContext.RequestAborted);

            Console.WriteLine("Http Request Body: {0}", content);

            return Ok();
        }
复制代码

 

posted @   旋风小伙  阅读(619)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示