【发布时间】:2020-02-19 18:22:02
【问题描述】:
我正在尝试将 ASP.NET Core 控制器中的请求正文作为 byte[] 数组。这是我最初写的:
var declaredLength = (int)request.ContentLength;
byte[] fileBuffer = new byte[declaredLength];
request.Body.Read(fileBuffer, 0, declaredLength);
此代码有效,但仅适用于小请求(约 20KB)。对于较大的请求,它会填满数组中的前 20,000 个左右字节,然后数组的其余部分为空。
我在置顶答案here中使用了一些代码,并且在重写我的代码后能够成功读取整个请求体:
var declaredLength = (int)request.ContentLength;
byte[] fileBuffer = new byte[declaredLength];
// need to enable, otherwise Seek() fails
request.EnableRewind();
// using StreamReader apparently resolves the issue
using (var reader = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true))
{
reader.ReadToEnd();
}
request.Body.Seek(0, SeekOrigin.Begin);
request.Body.Read(fileBuffer, 0, declaredLength);
为什么StreamReader.ReadToEnd() 能够成功读取整个请求体,而Stream.Read() 却不能?两次读取请求流感觉就像是 hack。有没有更好的方法来解决这个问题? (我只需要将流读入字节数组一次)
【问题讨论】:
-
StreamReader 使用 Windows 文件系统方法在到达 EOF 时关闭流,而远端没有关闭流。
-
你绝对应该考虑切换到Pipelines。
标签: c# asp.net-core .net-core