【问题标题】:HTTPClient Buffer Exceeded 2G; Cannot write more bytes to the bufferHTTPClient 缓冲区超过 2G;无法向缓冲区写入更多字节
【发布时间】: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


    【解决方案1】:

    这样的事情会起作用吗?

    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 反序列化倾向于默默地丢弃它不知道如何处理的信息,并导致一个空的或稀疏填充的对象。 Tracewriter 将帮助诊断这些问题。 Example

    【讨论】:

    • 首先使用较小的响应进行测试,它会加载响应然后什么也不做。但它给了我研究流媒体的想法,我发现了另一个问题(无效的强制转换异常)。
    • 这带来了一个新的 - 非常奇怪的问题:stackoverflow.com/questions/39422246/…
    • 当你说什么都没发生时,我假设你的意思是返回的对象是空的。确保在 Deserialize 中包含 typeof 参数(它不在您的其他问题中)。然后尝试添加一个 ITraceWriter 来调试反序列化。我相应地修改了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多