如何使用 System.IO.Pipelines.PipeReader 读取 ASP.NET 应用程序中的所有 POST 正文字节?

2024-05-03

我正在尝试使用 .Net 6 将我的 ASP.NET 应用程序从 Stream 切换到 PipeReader按照微软的推荐 https://youtu.be/1koWtKkKb_o。这是我的自定义方法:

private static async Task<byte[]> GetRequestBodyBytesAsync(PipeReader reader)
{
    byte[] bodyBytes;

    do
    {
        ReadResult readResult = await reader.ReadAsync();
        if (readResult.IsCompleted || readResult.IsCanceled)
        {
            ReadOnlySequence<byte> slice = readResult.Buffer.Slice(readResult.Buffer.Start, readResult.Buffer.End);
            bodyBytes = BuffersExtensions.ToArray(slice);
            reader.AdvanceTo(readResult.Buffer.End);
            break;
        }
    } while (true);

    return bodyBytes;
}

但是,当我在控制器中使用上述静态方法时:

[HttpPost]
[Route(MyUrl)]
public async Task MyPostAsync()
{
    byte[] bodyBytes = await GetRequestBodyBytesAsync(Request.BodyReader);
    MyProtobuf myProtobuf = MyProtobuf.Parser.ParseFrom(bodyBytes);

然后我可以在调试器中看到readResult.IsCompleted从来都不是真的,并且readResult.Buffer保持相同的 21 字节。

Adding else { reader.AdvanceTo(readResult.Buffer.Start); }没有改变任何东西。

我需要完整的字节数组,以便我可以将其传递给 Protobuf 解析方法(protobuf 没有流解析器)...我如何在这里使用 IO.Pipelines?

UPDATE:

以下方法(见PipeReaderExtensions.cs https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/common/testassets/Tests.Utils/PipeReaderExtensions.cs并由 Marc 确认)现在对我有用,甚至可以通过避免复制数据来进一步改进 - 请参阅下面 Marc 的精彩评论。

private static async Task<byte[]> GetRequestBodyBytesAsync(PipeReader reader)
{
    do
    {
        ReadResult readResult = await reader.ReadAsync();
        if (readResult.IsCompleted || readResult.IsCanceled)
        {
            return readResult.Buffer.ToArray();
        }

        // consume nothing, keep reading from the pipe reader until all data is there
        reader.AdvanceTo(readResult.Buffer.Start, readResult.Buffer.End);
    } while (true);
}

你应该打电话AdvanceTo每次之后ReadAsync,所以你真的应该有一个else这样做是这样的:

reader.AdvanceTo(readResult.Buffer.Start, readResult.Buffer.End);

这表示“我已经检查了所有内容,但没有消耗任何东西”(至少在语义上;你是否真的没有消耗过任何东西并不重要)looked无论如何 - 重点是说“所有这些字节:对我来说还没有用”) - 这意味着ReadAsync now在有一些额外数据之前不应尝试为您提供任何其他内容or数据已结束。实际上,我有点惊讶它并没有抛出异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 System.IO.Pipelines.PipeReader 读取 ASP.NET 应用程序中的所有 POST 正文字节? 的相关文章

随机推荐

  • 非常大的 JTable、RowFilter 和额外负载

    我想请求澄清 RowFilter 的使用及其对性能的影响 我通过 include Entry 方法实现了一个过滤器 对于每一行 只需检查模型中其对应值是否设置了布尔标志 如果是 则返回 true 否则返回 false 现在 我拥有的 JTa
  • 为什么 Z3 对于很小的搜索空间来说很慢?

    我正在尝试制作一个 Z3 程序 在 Python 中 它生成执行某些任务的布尔电路 例如 添加两个 n 位数字 但性能非常糟糕 以至于对整个解决方案空间进行强力搜索将导致快一点 这是我第一次使用 Z3 所以我可能会做一些影响我性能的事情 但
  • 添加ssrs报告描述

    无论如何 我可以添加一个在执行前显示在报告中的 ssrs 报告描述吗 我用谷歌搜索 大多数人说这是不可能的 但必须有一种方法来调整它 对吗 对于仍然需要添加用户可以在执行报告之前阅读的报告描述的任何人 我在我使用的两个 SSRS 版本 20
  • 如何使用 RedirectToAction 维护 ModelState?

    如果我的操作中有错误 如何返回不同操作的结果或将用户移至不同的操作ModelState不失去我的ModelState信息 场景是 Delete操作接受来自我的 DELETE 表单的 POSTIndex动作 视图 如果有错误Delete我想将
  • python中的指数分布随机生成器(对数函数)?

    我真的需要帮助 因为我被困在代码的开头 我被要求创建一个函数来研究直方图上的指数分布 函数为 x log 1 y 是一个常数 我在代码中将其称为 lamdr 并简单地给了它 10 我给了 N 随机数的数量 10 并运行了代码 但结果和生成的
  • 将多个参数绑定到mysqli查询中

    现在我需要使用以下结构来处理将多个参数绑定到 mysqli 查询中 if words total 1 statement gt bind param s words 0 else if words total 2 statement gt
  • 在 Visual Studio 中包含一个似乎仅适用于 Linux 的网格框架?

    我使用带有 Web Essentials 扩展的 Visual Studio 2013 来完成所有 Sass Scss 工作 这很棒 我发现了一个关于网格框架的教程 我真的很想使用它 名为Susy https github com eric
  • 设置显式注释处理器

    我正在尝试将 Maven 存储库添加到我的 Android Studio 项目中 当我进行 Gradle 项目同步时 一切都很好 但是 每当我尝试构建我的 apk 时 都会收到此错误 Execution failed for task ap
  • 无法使用docx将base64编码的图像添加到word文档中

    我需要使用 python docx 模块将图像添加到 word 文档中 将base64编码的数据转换为base64字节 然后转换为图像流 现在我尝试将图像流添加到word文档中 import io from docx import Docu
  • 如何创建一个在给定范围内随机打乱数字的 int 数组[重复]

    这个问题在这里已经有答案了 基本上 假设我有一个可以容纳 10 个数字的 int 数组 这意味着我可以在每个索引中存储 0 9 每个数字只能存储一次 如果我运行下面的代码 int num new int 10 for int i 0 i l
  • SQLite3 数据库中的派生字段

    各位晚上好 今天想问一个关于SQLite3中的派生字段 也称为计算字段 的问题 利用存储在我的数据库中的两个值 重量 和 距离 我知道可以利用它们来执行计算 以利用需要这两个值的公式返回我想要的值 但是我想知道是否有一种方法可以通过 SQL
  • 使用 Glide 和 SimpleTarget 将图像随机加载到视图寻呼机中

    我在用着Glide将图像加载到ViewPager使用一个PagerAdapter 当我使用以下方法加载图像时 Glide with mContext load mImage placeholder R drawable placeholde
  • 从 python 跟踪 Google Analytics

    我正在尝试从 python 后端跟踪 GA 事件以进行电子商务分析 它的写法在官方文档中 https developers google com analytics devguides collection protocol v1 devg
  • 从具有 Holo 父主题的 Theme.Light 继承 editText

    我想继承editText from android Theme而我的父主题是android Theme Holo Light 有没有什么 干净 的方法可以将资源从 android sdk 文件夹复制到我的项目中 所以我的想法是有一个自定义主
  • Chrome 扩展程序启用 Flash 插件

    我正在开发一款在 Adob e Flash 中运行的游戏 从 Chrome 69 开始 每次用户重新启动浏览器时 使用 Flash 的网站都需要明确的权限才能运行它 我们预计很多玩家会被放弃 因为他们每次重新启动浏览器时都需要经历点击播放流
  • 在 Visual Studio 2010 中删除 .pdb 文件

    当我使用 Visual Studio 2010 编译 sln 文件时 会生成 pdb 文件 如何禁用 pdb 文件的创建 项目属性 构建 高级 中有一个选项 将 调试信息 更改为 无 但是 只有在确定不需要它们时才应该这样做 最好保留 PD
  • Swift 尝试呈现 UIAlertController,其视图不在窗口层次结构中(在 TWTRShareEmailViewController 之后呈现)

    我在应用程序的注册过程中使用 Twitter 登录 我正在询问用户的电子邮件 一旦我得到它 我想展示一个 UIAlertController 这是我的代码 func askForTWMail if Twitter sharedInstanc
  • Java:提取具有多个子目录的zip文件[重复]

    这个问题在这里已经有答案了 我有一个 zip Meow zip 它有多个文件和文件夹 如下所示 Meow zip 文件 txt 程序 exe Folder 资源 xml AnotherFolder OtherStuff 更多资源 xml 我
  • 参数数量未知的 IMP

    是否可以创建一个参数数量与正在解析的实例方法的选择器相匹配的 IMP 我可以使用 if 语句和有限数量的参数 例如0到10之间 但是是否可以使用例如 IMP implementationWithBlock 和 va args 您无法在 C
  • 如何使用 System.IO.Pipelines.PipeReader 读取 ASP.NET 应用程序中的所有 POST 正文字节?

    我正在尝试使用 Net 6 将我的 ASP NET 应用程序从 Stream 切换到 PipeReader按照微软的推荐 https youtu be 1koWtKkKb o 这是我的自定义方法 private static async T