IAsyncEnumerable 块大小限制和 HttpResponse JSON 的格式约定 [已关闭]

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

我观察到,如果我增加 .NET C# 控制器方法之间的间隔,结果如下:-

   await Task.Delay(100);  // Slow down the Demo

每个服务器产量与 Javascript 对应 1:1:-

response.body.getReader()  read()

但在全速下,结果会缓冲到 JSON 的“N”个字节块。

编辑2

我的问题是:

有人可以提供示例或相应文档的链接,说明 Javascript 处理来自 C# .NET IASyncEnumerable 控制器方法的 FETCH 响应的正确方法吗? 感谢您的阅读。

最终编辑请为其他人重新打开

我的问题是,如何复制以下提供的 C# 功能:-

JsonSerializer.DeserializeAsyncEnumerable

可以在 here 找到 Javascript 的示例?

c# json httprequest streaming iasyncenumerable
1个回答
0
投票

以下 JS 被证明是非常健壮和有弹性的。

“默认”缓冲区大小似乎为 32KB,并且尚未经历不可预测或非规范/启发式可发现的撕裂。不知道缓冲是通过 System.Text.Json 还是 Kestrel 还是 HTTP。我也不知道刷新缓冲区之前的时间限制是多少,但大约是 0.3 秒。

我们可以在哪里拉动一些杠杆来配置/控制它?

        async function nameFetch(elem, appender, abortSignal)
    {
          var   reader, 
                result;

          const decoder = new TextDecoder();

          const abortControl = new AbortController();
          const signal = abortControl.signal;
          var canTimer = setTimeout(() =>
            {
                abortControl.abort(); 
                console.log("*ABORTED*")
            }, 2000); // Simulate a cancel 

          const fetchOpts = {signal:signal, method:'GET', cache:"no-cache"};
          const response = await fetch("https://localhost:7196/data/yieldfamilyname?inname=" + encodeURIComponent(elem.value), fetchOpts).catch(
            err => {
                console.log(err.message);
          });

          if (!signal.aborted) {
              reader = response.body.getReader();
              result = await reader.read();
          }

          fetchLoop:
              while (!signal.aborted && !result.done)
              {
                    var personText = "[" + decoder.decode(result.value).replace(/\[|]/g, '').replace(/(^\s*,)|(,\s*$)/g, '') + "]";
                    console.log("*"+personText+"*");
                    var personArray;
                    try {
                        personArray = JSON.parse(personText);
                    } catch (err) {
                        personArray = [];
                        console.log("Failed to parse JSON Result " + err.message)
                    }
                    for (let i=0; i<personArray.length; i++)
                    {
                        if (signal.aborted) {
                            break fetchLoop;
                        }
                        var person = personArray[i];
                        person.familyName = decodeURIComponent(person.familyName);
                        console.log("chunk is", person.familyName);
                        appender.append(person.familyName, person.familyName);
                    }

                    try {
                        result = await reader.read();
                    }
                    catch (err) {
                        console.log(err.message); 
                        break;
                    }
              }

          appender.close();
          clearTimeout(canTimer);

          if (reader !== undefined) {
            reader.releaseLock();
          }
    }
© www.soinside.com 2019 - 2024. All rights reserved.