.NET 7中EndpointFilter获取请求体字符串始终为空的问题
解决Minimal API EndpointFilter读取请求体为空的问题
问题原因
你的代码中,EndpointFilter的执行时机在模型绑定之后:Minimal API会先读取请求体,将其绑定到Todo todo参数上,此时Request.Body的流指针已经移动到末尾,后续再调用ReadToEndAsync()自然会得到空字符串。
解决方案
方法1:启用请求体缓冲并重置流位置
通过EnableBuffering()让请求体流支持重读,读取完成后将流指针重置到起始位置,确保后续模型绑定能正常读取。修改后的代码如下:
app.MapPost("/todo", async (Todo todo) => { await Task.Run(() => { string x = "R";}); return Results.Created($"/todo/{0}", 1); }) .WithName("PostToDo") .WithOpenApi() .AddEndpointFilter(async (context, next) => { var request = context.HttpContext.Request; // 启用缓冲,允许流被多次读取 request.EnableBuffering(); using (var bodyReader = new StreamReader(request.Body)) { string rawBody = await bodyReader.ReadToEndAsync(); // 重置流指针到起始位置,保证模型绑定能正常读取 request.Body.Position = 0; } var result = await next(context); return result; });
说明
EnableBuffering()会将请求体缓存到内存(小体积请求)或临时文件(大体积请求),让流支持Seek操作。重置Position到0后,后续的模型绑定流程就能重新读取请求体内容,不会影响原有逻辑。
内容的提问来源于stack exchange,提问作者Joe Anzalone
相关产品推荐
相关产品推荐

