.net 使用HttpClient在无缓冲的情况下上载大负载
我正在使用HttpClient发送一个POST请求,其中包含一个大的mutlipart负载。事实证明,HttpClient正在缓冲整个请求,通过尝试发送一个大文件,很容易重新创建内存不足错误。HttpClient为构建多部分负载提供了一个很好的框架,但是有可能阻止它缓冲请求吗 我正在使用.NET4.7.2 编辑: 我甚至试过推流内容:.net 使用HttpClient在无缓冲的情况下上载大负载,.net,httpclient,dotnet-httpclient,.net,Httpclient,Dotnet Httpclient,我正在使用HttpClient发送一个POST请求,其中包含一个大的mutlipart负载。事实证明,HttpClient正在缓冲整个请求,通过尝试发送一个大文件,很容易重新创建内存不足错误。HttpClient为构建多部分负载提供了一个很好的框架,但是有可能阻止它缓冲请求吗 我正在使用.NET4.7.2 编辑: 我甚至试过推流内容: byte[] binBuffer = new byte[4096]; int iRead = 0; PushStreamContent partAttachme
byte[] binBuffer = new byte[4096];
int iRead = 0;
PushStreamContent partAttachment = new PushStreamContent((stream, content, context) =>
{
using (Stream strData = File.Open(@"c:\test\big.csv", FileMode.Open, FileAccess.Read, FileShare.Read))
{
while ((iRead = strData.Read(binBuffer, 0, binBuffer.Length)) > 0)
{
stream.Write(binBuffer, 0, iRead);
};
}
stream.Close();
});
我在流中遇到一个OOM异常。当我达到大约2 Gig时编写。我相信您必须使用
HttpWebRequest
类才能做到这一点
大概是这样的:
HttpWebrequest request = _httpClient.Request(url, contentType);
request.AllowWriteStreamBuffering = false;
using( var stream = await request.GetRequestStreamAsync().ConfigureAwait(false))
{
await yourPayloadMessage.CopyToAsync(stream);
}
PushStreamContent将允许您发送无缓冲的字节流
var httpClient = new HttpClient();
var request = new HttpRequestMessage() {
RequestUri = ... ,
Method = HttpMethod.POST,
Content = new PushStreamContent(async (stream, httpContent, transportContext) =>
{
// write to the stream from where ever you are getting the bytes from
stream.Close();
})
};
await httpClient.SendAsync(request);
从这里可以看出,PushStreamContent所做的一切就是通过SerializeToStream方法从HttpClientHandler接收网络流,并允许您直接向其写入
我隐约记得早期版本的.NET4存在一个问题,它实际上阻止了使用分块传输编码。我记得它是固定的,但我不是100%肯定。如果分块编码不起作用,这是管道的HttpClientHandler端的问题,而不是HttpClient或PushStreamContent中的问题。使用PushStreamContent,如问题@DarrelMiller-PushStream still buffers中所示,据我所知,我是在4.7.2框架上执行此操作的,但仍然会出现内存不足异常。在流上。写。请参阅编辑我的原始帖子。@Jeremy这只是一个使用HttpClientHandler的“库存”HttpClient实例吗?没有授权管理员?