.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
相关产品推荐
相关产品推荐

