我正在使用 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,默认情况下它也会等待直到所有值都解析完毕,然后将所有值立即发送到客户端。
我发现的解决方案可能部分有用:
我尝试检查官方软件包文档,但没有找到任何可以帮助我解决该问题的内容。还寻找任何类似的问题或例子并没有给我答案。
当我可以调用此端点并立即一一获得结果时,我将不胜感激,这将使我更接近解决方案。
当我遇到类似问题时,我详细研究了这个问题,这就是我发现的:
首先,要在最新版本的 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
}
}