解析HTTP响应到达时

问题描述 投票:0回答:1

我的Web API AAA调用另一个API BBB来检索大型JSON数组(~500-1000 KB,每个对象为10 KB),它需要解析JSON数组以对其应用逻辑并将响应转发给API CCC。

为了优化,我希望我的Web API AAA没有存储包含大型JSON数组的HTTP响应,因此数组不必存储在LOH(大对象堆)中。

我认为解决这个问题的一个好主意是:不是等待下载完整的JSON数组,而是可以在响应时解析响应的元素,这样我就可以解析它,在其上应用逻辑并转发内容到我的API CCC?

所以我的Web API永远不会将大型JSON数组存储在内存中。通过在每个对象到达时对其进行解析,该对象非常小,以至于它将存储在GEN 0中并且通过GC非常快速地收集。

到目前为止我尝试了什么:

我的API BBB看起来像这样(简化):

[HttpGet("{id}")]
public IActionResult Get(int id)
{
    var text = System.IO.File.ReadAllText("C:\\Users\\John\\generated1000objects.json");
    var deserialized = JsonConvert.DeserializeObject<object[]>(text);
    return Ok(deserialized);
}

我的代码要查询

var httpClient = new HttpClient();

using (var request = new HttpRequestMessage(HttpMethod.Get, "https://localhost:44328/api/values/4"))
using (var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
using (Stream stream = await response.Content.ReadAsStreamAsync())
using (StreamReader sr = new StreamReader(stream))
using (JsonReader reader = new JsonTextReader(sr))
{
    reader.SupportMultipleContent = true;
    while (true)
    {
         if (!reader.Read())
         {
                break;
         }

         JsonSerializer serializer = new JsonSerializer();
         var deserialize = serializer.Deserialize<object>(reader);

         Console.WriteLine(deserialize); // HERE it prints the whole JSON Array. I was expecting to deal with one object of the array
         Console.WriteLine("#################");

     }
}

我的约束:

  • 我无法修改发送大型JSON数组的API BBB。
  • 我的API CCC无法直接调用API BBB来检索大型JSON数组

我使用ASP.NET Core 2.2进行.NET Core。

c# asp.net-core memory-management
1个回答
0
投票

看看你的解决方案,除非你期望它的规模大幅增长,否则我相信你可能会试图尝试进行微优化,这实际上会使你的过程比通过简单的常规处理更加脆弱。

你提到的记录大小为10k,响应大小为500-1000k。这相当于总共50-100条记录。

我相信你会在尝试解析块中的响应时遇到更多困难,而不是在大对象堆上提供对象的任何影响。从我在各种文档中可以找到的内容来看,使用内置库解析JSON文档的唯一方法是解析整个文档。任何分块都需要由您自己管理。

© www.soinside.com 2019 - 2024. All rights reserved.