Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用HttpClient在无缓冲的情况下上载大负载_.net_Httpclient_Dotnet Httpclient - Fatal编程技术网

.net 使用HttpClient在无缓冲的情况下上载大负载

.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

我正在使用HttpClient发送一个POST请求,其中包含一个大的mutlipart负载。事实证明,HttpClient正在缓冲整个请求,通过尝试发送一个大文件,很容易重新创建内存不足错误。HttpClient为构建多部分负载提供了一个很好的框架,但是有可能阻止它缓冲请求吗

我正在使用.NET4.7.2

编辑:

我甚至试过推流内容:

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实例吗?没有授权管理员?