【发布时间】:2016-09-10 01:10:35
【问题描述】:
Walmart API 传奇的最新进展。我正在提交调用以获取使用 HttpClient 的清关项目列表。其他请求都可以正常工作,但是这个请求太大了,以至于破坏了 HTTPRequest 缓冲区。 奇怪的是,这是一个请求缓冲区错误而不是响应错误,因为请求只是 URL。
异常信息:
Cannot write more bytes to the buffer than the configured maximum buffer size: 2147483647. (System.Net.Http)
在 System.Net.Http.HttpContent.LimitMemoryStream.CheckSize(Int32 countToAdd)\r\n 在 System.Net.Http.HttpContent.LimitMemoryStream.Write(Byte[] 缓冲区,Int32 偏移量,Int32 计数)\r\ n 在 System.Net.Http.StreamToStreamCopy.TryStartWriteSync(Int32 bytesRead)\r\n 在 System.Net.Http.StreamToStreamCopy.StartRead()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 - --\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter
1.GetResult()\r\n at Wal_Mart_Crawler.NET_IO.<walMart_Special_Feed_Lookup>d__4.MoveNext() in c:\\users\\user\\documents\\visual studio 2015\\Projects\\Wal-Mart_Inventory_Tracker\\Wal-Mart_Crawler\\NET_IO.cs:line 65\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n 在 Wal_Mart_Crawler.Special_Feeds.d__2.MoveNext() 在 c:\users\user\documents\visual studio 2015\Projects\Wal-Mart_Inventory_Tracker\Wal-Mart_Crawler\Special_Feeds.cs:第 22 行
(好奇的话,第 22 行是):
API_Json_Special_Feeds.RootObject Items = await net.walMart_Special_Feed_Lookup(specialFeedsURLs[i].Replace("{apiKey}", Wal_Mart_Crawler.Properties.Resources.API_Key_Walmart));
//which uses HttpClient to call the API
一开始看到“已配置”的时候,我的眼睛微微一闪,因为那意味着我可以改变它,对吧?毕竟我在 x64 中运行 - 可能能够破坏 2G 不知道如何。
阅读 SO,发现我应该禁用流媒体。试过了:
var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
... 没有布埃诺。
找到 WebRequest 的 AllowReadStreamBuffering 设置 - 似乎找不到 HttpClient 的设置。
我无法控制我获得了多少数据——那是在 Walmart 上。我也受限于如何处理响应流,因为它会直接反序列化:
var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
return JsonConvert.DeserializeObject<API_Json_Special_Feeds.RootObject>(result);
所以即使我可以分解响应,我也会被卡住,因为我认为我不能提供部分数据来反序列化。
问题:我怎样才能将缓冲区增加到超过 2G 或避免缓冲区大小超出异常?
我希望这是另一个容易解决我疲惫、无知的大脑无法弄清楚的问题。一如既往 - 真诚地感谢您抽出宝贵的时间,并提前为您提供任何帮助。
响应标头:
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
X-Mashery-Responder: prod-j-worker-us-west-1c-63.mashery.com
transfer-encoding: chunked
Connection: keep-alive
Date: Sat, 10 Sep 2016 00:57:38 GMT
Server: Mashery
Server: Proxy
Content-MD5: BvJMDJiZPUvmAxxmwKGSog==
Content-Type: application/json; charset=utf-8
Last-Modified: Fri Sep 09 15:31:08 PDT 2016
}
【问题讨论】:
标签: c# dotnet-httpclient