最新成为沃尔玛API的传奇故事。我正在提交一个使用HttpClient获取清除项目列表的电话。事情与其他请求一起正常工作,但是这个请求很大,它会破坏HTTPRequest缓冲区。 奇怪的是,这是一个REQUEST缓冲区错误,而不是RESPONSE错误,因为请求只是URL。
例外情况:
vpadal
at System.Net.Http.HttpContent.LimitMemoryStream.CheckSize(Int32 countToAdd)\ r \ n在System.Net.Http.HttpContent.LimitMemoryStream.Write(Byte [] buffer,Int32 offset,Int32 count)\ r \在System.Net.Http.StreamToStreamCopy.TryStartWriteSync(Int32 bytesRead)\ r \ n中的System.Net.Http.StreamToStreamCopy.StartRead()\ r \ n ---从抛出异常的上一个位置开始的堆栈跟踪结束 - - 位于System.Runtime.CompilerServices.TaskAwaiter的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n,在System.Runtime.CompilerServices.TaskAwaiter上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n
Cannot write more bytes to the buffer than the configured maximum buffer size: 2147483647. (System.Net.Http)
1.GetResult()\ r \ n位于c:\ users \ user \ documents \ visual studio 2015 \ Projects \ Wal-Mart_Inventory_Tracker \ Wal-Mart_Crawler \ Special_Feeds中的Wal_Mart_Crawler.Special_Feeds.d__2.MoveNext()。 cs:第22行
(好奇的是22号线):
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.TaskAwaiter
起初,当我看到“已配置”时,我的眼睛闪烁了一下,因为这意味着我可以改变它,对吧?我毕竟是在x64中运行 - 可能会破坏2G 无法弄清楚如何。
读取SO,发现我应该禁用流媒体。尝试:
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
... no Bueno。
为WebRequest找到 AllowReadStreamBuffering 设置 - 似乎无法为HttpClient找到一个。
我无法控制我获得的数据量 - 这是沃尔玛的数据。我对于如何处理响应流而感到畏缩,因为它会直接反序列化:
var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
所以即使我能够分解响应,我也会被卡住,因为我不认为我可以提供部分数据来反序列化。
问题:如何将缓冲区增加到2G以上或者避免缓冲区大小超出异常?
我希望这是另一个容易解决我厌倦,无知的大脑根本无法弄清楚。一如既往 - 真诚地感谢您的时间,并提前为您提供任何帮助。
响应标题:
var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
return JsonConvert.DeserializeObject<API_Json_Special_Feeds.RootObject>(result);
答案 0 :(得分:0)
这样的事情会起作用吗?
using (var http = new HttpClient())
using (var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
using (StreamReader sr = new StreamReader(await response.Content.ReadAsStreamAsync()))
{
var serializer = new JsonSerializer();
ITraceWriter tw = new MemoryTraceWriter();
serializer.TraceWriter = tw;
var obj = (API_Json_Special_Feeds.RootObject)serializer.Deserialize(sr, typeof(API_Json_Special_Feeds.RootObject));
// Stop and inspect the tracewriter object here to diagnose
return obj;
}
编辑:通过包含跟踪编码器,您可以尝试确定反序列化为何不像您期望的那样运行。 JSON反序列化倾向于默默地丢弃它不知道如何处理并导致空的或人口稀疏的对象的信息。该撰稿人将帮助诊断这些问题。 Example