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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:47:17