我正在使用我的客户端获取有关存储在我的Swift对象存储中的某个文件的一些信息,可以通过REST Api访问该文件。在Swift中,HEAD方法和指向对象的url返回HTML响应(包含NO CONTENT)头中包含的元数据(哈希,时间戳等)。
我的代码在文件大小为< 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 Client(Chrome扩展程序)执行相同操作时,我没有问题。似乎Content-Length标题使它变得不可行。以下是Dev HTTP Client的输出:
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而不读取消息内容就会完成操作。
答案 0 :(得分:28)
使用SendAsync重载,允许您指定HttpCompletionOptions。有了这个,您可以告诉HttpClient不要为响应内容创建缓冲区。
答案 1 :(得分:0)
增加缓冲区大小的另一种方法是
HttpClient client = new HttpClient();
client.MaxResponseContentBufferSize = 9999999;