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

