使用 HotChocolate GraphQl for .NET 项目流式传输数据 - 一次性获得所有结果,而不是一个接一个的问题

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

我正在使用 C#、.NET7 最小 API 和 HotChocolate GraphQl。我正在尝试设置 graphQl 简单查询端点,它将能够返回这样的流:

public async IAsyncEnumerable<string> GetDummyNumbers()
{
    for (var i = 0; i < 10; i++)
    {
        await Task.Delay(TimeSpan.FromSeconds(1));
        yield return i.ToString();
    }
}

它按原样工作,但即使它是 IAsyncEnumerable,默认情况下它也会等待直到所有值都解析完毕,然后将所有值立即发送到客户端。

我发现的解决方案可能部分有用:

  1. GraphQl 有“@stream”指令,但它不能开箱即用,可能需要一些配置或实现,但我没有找到如何实现此目的的资源。
  2. 订阅可以工作,但这并不完全是我所需要的,因为我不需要实时数据,我只需要按请求流式传输数据。

我尝试检查官方软件包文档,但没有找到任何可以帮助我解决该问题的内容。还寻找任何类似的问题或例子并没有给我答案。

当我可以调用此端点并立即一一获得结果时,我将不胜感激,这将使我更接近解决方案。

.net graphql stream hotchocolate minimal-apis
1个回答
0
投票

当我遇到类似问题时,我详细研究了这个问题,这就是我发现的:

首先,要在最新版本的 HotChocolate(撰写本文时为 13.4.0)中启用流式传输,您需要添加以下代码(链接):

services.AddGraphQLServer()
    .ModifyOptions(o =>
    {
        o.EnableStream = true;
    })
    .AddQueryType<Query>()
    ...

然后,在请求类中,用

[StreamResult]
属性标记你的方法,之后你需要使返回类型更复杂(检查字符串时,流式传输不起作用)

public class Query
{
    [StreamResult]
    public async IAsyncEnumerable<Result> GetDummyNumbers()
    {
        for (var i = 0; i < 5; i++)
        {
            await Task.Delay(TimeSpan.FromSeconds(1));
            yield return new Result(i);
        }
    }

    public record Result(int id);
}

完成这些步骤后,您可以使用指令

@stream
编写查询并确保一切正常:)

query test {
  dummyNumbers @stream {
    id
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.