You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Minimal API中如何获取Post/Put请求的原始Body内容?

.NET Minimal API 读取Post/Put原始Body为空的解决办法

问题原因

请求流只能被读取一次:你的端点参数中使用了[FromBody] BasisTypeDto dto,ASP.NET Core框架在执行端点方法前,已经读取了Request.Body流来完成dto的绑定,此时流的位置已经移动到末尾。后续在过滤器中调用ReadToEnd()时,流已经没有剩余内容可读取,所以得到空字符串,即便ContentLength显示有有效长度。

解决方案

通过启用请求流缓冲,让流支持多次读取,修改你的端点过滤器代码如下:

.AddEndpointFilter(async (efiContext, next) => {
    var request = efiContext.HttpContext.Request;
    
    // 启用缓冲,将请求流转换为可重读的内存流
    request.EnableBuffering();
    
    // 重置流位置到起始处
    request.Body.Position = 0;
    
    // 异步读取原始Body内容
    using var reader = new StreamReader(request.Body, leaveOpen: true);
    var rawMessage = await reader.ReadToEndAsync();
    
    // 再次重置流位置,确保后续[FromBody]绑定能正常读取流
    request.Body.Position = 0;
    
    return await next(efiContext);
})

关键说明

  • request.EnableBuffering():将原始请求流包装为内存流,使其支持多次读取和位置重置,这是.NET 6+提供的扩展方法,需确保引用Microsoft.AspNetCore.Http命名空间。
  • 使用ReadToEndAsync()异步读取,避免同步IO带来的性能问题,同时设置leaveOpen: true确保StreamReader不会关闭请求流。
  • 两次重置流位置:读取前重置到开头保证能读到完整内容,读取后重置确保后续的[FromBody]绑定可以正常消费流。

内容的提问来源于stack exchange,提问作者vitaly-post

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:02