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

.NET Core读取HttpRequest请求体仅获4019字符问题求助

问题原因

你遇到的问题是因为HttpRequest.BodyReader.ReadAsync()单次调用只会读取当前可用的缓冲区数据,默认缓冲区大小约4KB(对应你看到的4019字符,因编码差异略有不同)。当POST内容超过这个大小,单次读取只能拿到第一块数据,后续内容还未被加载到内存,所以只能获取前4019个字符。

解决方案

方案1:循环读取BodyReader直到完成

通过循环调用ReadAsync(),持续读取直到获取全部请求内容:

public static async Task<string> GetContentBody(this HttpRequest? request)
{
    if (request == null)
        return string.Empty;

    request.Body.Position = 0;
    var contentBuilder = new StringBuilder();
    var reader = request.BodyReader;

    while (true)
    {
        var readResult = await reader.ReadAsync();
        var buffer = readResult.Buffer;

        try
        {
            // 缓冲区为空且读取完成时退出循环
            if (buffer.IsEmpty && readResult.IsCompleted)
                break;

            contentBuilder.Append(Encoding.Default.GetString(buffer.FirstSpan));
        }
        finally
        {
            reader.AdvanceTo(buffer.End);
        }
    }

    return contentBuilder.ToString().Trim();
}

方案2:利用已启用的缓冲直接读取Stream

因为你已经通过EnableBuffering()开启了请求体缓冲,此时可以直接使用request.Body的流读取方法,代码更简洁:

public static async Task<string> GetContentBody(this HttpRequest? request)
{
    if (request == null)
        return string.Empty;

    request.Body.Position = 0;
    // leaveOpen设为true,避免关闭流影响后续中间件读取
    using var streamReader = new StreamReader(request.Body, Encoding.Default, leaveOpen: true);
    var fullContent = await streamReader.ReadToEndAsync();
    // 重置流位置,保证后续逻辑能正常读取
    request.Body.Position = 0;
    return fullContent.Trim();
}

内容的提问来源于stack exchange,提问作者jstuardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:23:11