ASP.Net 7 Core Minimal API字节数组POST偶发接收为空问题
问题原因分析
客户端代码问题
客户端调用PostAsync时未使用await等待请求完成:
var client = new HttpClient(); byte[] arr = AnArrayThatIs100PercentneverEmpty(); Log.Information($"Sending {arr.Length} bytes"); // 缺少await,请求可能在发送过程中被提前终止 client.PostAsync(url, new ByteArrayContent(arr));
不等待异步操作完成的情况下,请求可能还没完成发送就被上下文回收,导致服务器接收到不完整甚至空的请求。
服务器端代码问题
服务器端调用CopyToAsync时同样未使用await,流复制操作还没执行完就读取ms.Length:
app.MapPost("/v1/agent_relay/call_result/{company_id}/{guid}", (HttpContext context, string company_id, string guid) => { var ms = new MemoryStream(); // 缺少await,复制操作未完成就执行后续代码 context.Request.Body.CopyToAsync(ms); // 此时ms还未写入数据,Length自然为0 Log.Information($"Post call_result for {company_id} {guid} {ms.Length}"); ... }
CopyToAsync是异步操作,不等待的话后续代码会立即执行,此时MemoryStream还没从请求体中读取到任何内容,所以长度为0。
修复方案
- 客户端添加
await,确保请求完整发送:
await client.PostAsync(url, new ByteArrayContent(arr));
- 服务器端添加
await,并重置流位置到起始处(避免后续读取从流末尾开始):
await context.Request.Body.CopyToAsync(ms); ms.Position = 0; Log.Information($"Post call_result for {company_id} {guid} {ms.Length}");
内容的提问来源于stack exchange,提问作者Daniel Williams
相关产品推荐
相关产品推荐

