C#按块检索HTTP POST块响应吗?

时间:2019-12-01 20:17:43

标签: c# json http-chunked

我正在使用一个API,该API接受HTTP POST请求以及URL形式编码的查询数据作为有效负载。服务器的响应是分块的,每个块都包含一个JSON对象。我正在尝试从C#中读取和解析服务器的响应(按块),以便可以获取该块,并用Newtonsoft进行转换,然后执行我需要的任何处理。服务器为每个查询返回一个未知的记录记录数-可能是0条记录,也可能是数千个数据块。

我对诸如HttpClient之类的典型解决方案的研究和测试表明,这些库仅通过将所有内容连接到单个响应流中来“处理”块。此外,我还阅读了其他文章,这些文章指出如果服务器未遵循100%的规范,甚至有可能在流的末尾得到异常。

我已经考虑过以下解决方案,但似乎都不是最佳选择:

  1. 从HTTP响应中逐个字符读取流,计算{}个字符,以找到JSON对象的开始和结束。每次找到结束}时,都会解析该对象。这非常丑陋,效率低下并且不是通用的-假设每个JSON响应都是一个对象,并且例如在服务器发送JSON数组([]的情况下,需要更改wuold) ,甚至每个块都只有一个JSON字符串。

  2. 完全跳过HttpRequest / HttpClient,并在原始套接字中执行所有操作。然后,我可以解析块大小,从套接字流中准确读取那么多字节,然后进行相应的解析。这是可行的,除了感觉到很多“重塑工作”,因为我必须为POST主体实现URL编码,标头解析,SSL / TLS等。这一切都已由HttpClient基本“解决”,因此实现如果除了我可以轻易引入一个解析错误之外,没有其他原因,我自己又觉得这是一个坏主意。

  3. 由于服务器每块发送一个JSON对象,请读取整个响应,然后查找}{并将其视为JSON对象的分割点(因为在实际的JSON中,将有一个{列表中两个对象之间的{1}}。最好的感觉是不可靠-假设每个块的JSON对象的两侧都没有空格。这也是低效率的,因为如果服务器要返回数百万条记录,则整个响应将需要存储在RAM中。包含数百万条记录的响应可能超过数百个块,总大小超过1GB。对于具有大量RAM的计算机来说,这并不是不必要的问题,但这是一种对可按设计进行流处理的数据进行解析的不必要的低效方法。

理想 场景是一种枚举器,它按块读取HTTP流,因为API会生成块,其中每个块恰好代表一个JSON对象。这就是我考虑的在选项2中实现的方法,但是再次看来,这似乎是在重新设计轮子,并可能引入严重的错误。第二种最佳选择是一种方法,它是在执行请求并解析标头之后,从HttpClient 获取基础套接字流的方法。获取包含 块大小和分隔符的流的方法,因此我可以直接解析 流,提取块大小,基本上执行上面的#2,而无需编写我自己的HTTP实现。

对我来说,实现此功能的最佳选择是什么?

0 个答案:

没有答案