当前位置: 首页 > 知识库问答 >
问题:

发送数据时,为什么System.Net.HTTP.StreamContent会将整个流读入内存,而忽略给定的缓冲区大小?

缑永年
2023-03-14

下面的代码将整个给定的stream数据读入内存,然后将其作为web请求发送,而不是以较小的块读取和发送数据。例如,如果流产生2 GB的数据,代码将在开始发送请求之前将所有2 GB的数据读入内存缓冲区。传递给StreamContent的构造函数的50 KB缓冲区大小似乎被忽略了。

using (var httpClient = new HttpClient())
{
  using (var content = new StreamContent(stream, 1024*50)) // 50 KB buffer size ignored?
  {
    using (var request = new HttpRequestMessage(HttpMethod.Post, requestUri))
    {
      request.Content = content;
      await httpClient.SendAsync(request);
    }
  }
}

共有1个答案

长孙阳嘉
2023-03-14

当给定的不支持查找时,就会发生这种情况。在这种情况下,StreamContent不能使用Stream.Lengty属性检索其大小,而这是构造HTTP请求消息所必需的。

但是,如果您指定应该使用“分块传输编码”,它就起作用了。这样,内容就可以分块发送,而不必预先确定其大小。

因此,这段代码将避免将整个数据加载到内存中,即使它不允许查找:

using (var httpClient = new HttpClient())
{
  using (var content = new StreamContent(stream, 1024*50))
  {
    using (var request = new HttpRequestMessage(HttpMethod.Post, requestUri))
    {
      request.Content = content;

      // Enable the request message to be sent without knowing the final content size
      request.Headers.TransferEncodingChunked = true;
      
      await httpClient.SendAsync(request);
    }
  }
}
 类似资料:
  • 问题内容: 我写了一个非常简单的函数,可以从给定的URL下载图像,调整图像大小并上传到S3(使用’gm’和’knox’),我不知道我是否在正确地将流读取到缓冲区中。(一切正常,但这是正确的方法吗?) 另外,我想了解一些有关事件循环的知识,如何知道该函数的一次调用不会泄漏任何内容,也不会将’buf’变量更改为另一个已经运行的调用(否则这种情况是不可能的,因为回调是匿名的功能?) 问题答案: 总的来说

  • 问题内容: 我有一个带有关系的实体,我想通过一个查询来检索它,因此使用。有时,Hibernate不尊重它,而是发出N + 1 秒。随着 有时 我的意思是,因为我不知道是什么触发它,我有案件对不同的查询,这可能发生,或者不一样的类。 这是带有我使用的注释的简化实体: 用 我希望单个查询能够同时获取其及其内容,例如 相反,我得到了第一选择所有N S和那么N 献给所有S(考虑没有缓存)。 我发现了许多类

  • 问题内容: 在使用stream2接口之后,如何将node.js缓冲区转换为Readable流? 问题答案: 使用流化器,您可以使用新的流API将字符串和缓冲区转换为可读流。

  • 我如何能转换一个node.js缓冲区到一个可读流以下使用Streum2接口? 我已经找到了这个答案和streambuffers模块,但是这个模块基于stream1接口。

  • 我读到FileWriter和BufferedWriter的区别在于FileWriter直接写入文件(逐字符),white BufferedReader使用缓冲区。如果是,为什么FileWriter有缓冲区?例如,如果我创建一个FileWriter对象,如下所示: 而且,如果我在程序结束时不刷新或关闭写入器,它将不会向文件写入任何内容。这意味着它也使用缓冲区。拜托,解释一下?

  • 这篇文章说默认的溢出策略是缓冲区。 doOnNext内部的subscribe()调用有不同的策略吗?