求教httpclient 传输的数据大小限制问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教httpclient 传输的数据大小限制问题相关的知识,希望对你有一定的参考价值。

参考技术A HttpPost httpPost = new HttpPost(hturl); List formparams = new ArrayList(); formparams.add(new BasicNameValuePair("name", "admin")); formparams.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity uefEntity;

超出 HttpClient 缓冲区大小限制

【中文标题】超出 HttpClient 缓冲区大小限制【英文标题】:HttpClient buffer size limit exceeded 【发布时间】:2013-09-10 13:35:23 【问题描述】:

我正在使用我的客户端获取有关存储在我的 Swift 对象存储中的某个文件的一些信息,该文件可以通过 REST Api 访问。在 Swift 中,指向指定对象的 HEAD 方法和 url 返回它的元数据(哈希、时间戳等),包含在 HTML 响应的(没有内容)标题中。

当文件大小小于 2GB 时,我的代码可以完美运行。我得到 HttpResponseMessage 并且能够解析它以获得所需的数据,但是当我要求文件 > 2GB 时出现异常:“无法向缓冲区写入比配置的最大缓冲区大小更多的字节:2147483647”。

我了解,HttpClient 属性 MaxResponseContentBufferSize 不能设置为值 > 2GB,但我不想获取它的内容。这是一些错误还是有更好的方法来解决这个问题?

public HttpResponseMessage FileCheckResponse(string objectName)
   
        //create url which will be appended to HttpClient (m_client)
        string requestUrl = RequestUrlBuilder(m_containerName, objectName);
        //create request message with Head method
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, requestUrl);
        //exception thrown here... 
        HttpResponseMessage response = m_client.SendAsync(request).Result;            

        return response;
    

当尝试使用 Dev HTTP 客户端(Chrome 扩展)执行相同的操作时,我没有问题。似乎 Content-Length 标头使其不可行。这是 Dev HTTP 客户端的输出:

Content-Length: 3900762112
Accept-Ranges: bytes
Last-Modified: Fri, 06 Sep 2013 16:24:30 GMT
Etag: da4392bdb5c90edf31c14d008570fb95
X-Timestamp: 1378484670.87557
Content-Type: application/octet-stream
Date: Tue, 10 Sep 2013 13:25:27 GMT
Connection: keep-alive

我会很高兴有任何想法! 谢谢

解决方案

首先 - 感谢 Darrel Mirrel,他在几秒钟内解决了我一整天的问题 :) 我只需要通过在获得响应的位置添加 HttpCompletitionOption 来编辑代码中的一行:

HttpResponseMessage response = m_client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;

ResponseHeaderRead 选项告诉客户端在不读取消息内容的情况下读取 Headers 后立即完成操作。

【问题讨论】:

【参考方案1】:

使用允许您指定 HttpCompletionOptions 的 SendAsync 重载。有了这个,你可以告诉 HttpClient 不要为响应内容创建缓冲区。

【讨论】:

哦,我的 $god 上帝 = Darrel Miller。太感谢了!!我不敢相信它会这么容易。我整天都在寻找解决方案:) 这对我有用:await _client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead); 对我不起作用,仍然得到System.Net.Http.HttpRequestException: Cannot write more bytes to the buffer than the configured maximum buffer size 我怎样才能为 PostAync 做到这一点? @aronccs 创建一个 HttpRequestMessage,将方法设置为 POST 并使用适当的 HttpCompletionOption 将其传递给 SendAsync。【参考方案2】:

另一种增加缓冲区大小的方法是

HttpClient client = new HttpClient();
client.MaxResponseContentBufferSize = 9999999; 

【讨论】:

以上是关于求教httpclient 传输的数据大小限制问题的主要内容,如果未能解决你的问题,请参考以下文章

Symfony HttpClient Stream 和 chunk->getContent() 超出正文大小限制

使用 httpclient 限制下载的带宽使用

HTTP POST 发送JSON格式数据(解决Expect:100-continue 问题)

Python 请求,如何限制接收大小、传输速率和/或总时间?

求教 VS环境下如何给c语言程序运行添加日期限制?

webservice接口和http(httpclient)接口区别