![](/img/trans.png)
[英]ASP.NET Core Kestrel on Linux never prompts for client certificate
[英]Querying Firestore for Boolean property in Asp.net Core/Kestrel Crashes in Linux Docker
这是在 IIS Express 和 Firestore 模拟器上使用 C# 在 Asp.Net Core 2.0 中本地工作的东西。 我正在尝试基于 GCP 的相同代码,其中 Asp.Net 核心在 GCP (Kubernetes) 的 Linux 容器内的 Kestrel 上运行
我可以确认这是特定于 Firestore 并且特定于使用布尔属性进行查询的,因为其他查询工作正常。
CollectionReference FoosRef = FirestoreDb.Collection(FooKind);
Query query = FoosRef.WhereEqualTo("IsGoodFoo", true);
// QuerySnapshot querySnapshot = await query.Offset(offset).GetSnapshotAsync();
// Query query = FoosRef.WhereEqualTo("FooName", "p,ezbnR33GU_");
QuerySnapshot querySnapshot = await query.GetSnapshotAsync();
DocumentSnapshot documentSnapshot = querySnapshot.Documents.FirstOrDefault();
正如您所看到的,注释代码在相同设置中运行良好,同时查询“IsGoodFoo”并失败。 我可以确认 Firestore 上的数据仅保存为布尔值,因为在 Firestore UI 中搜索“true”不会给我任何结果。 (在 Firestore 模拟器上查询真实作品)
由于这是一次严重的崩溃,我也没有看到任何写入 StackDriver 的日志,也不知道在哪里检查 Kestrel 日志或正确调试此问题。
结果证明问题不是“使用布尔属性进行查询”,而是“尝试检索具有大约 200,000 个结果的查询结果”。
有几个选项可以执行此操作。 当查询仍然具有足够少的结果时,最简单的一种方法是使用StreamAsync
方法。 使用 C# 8(以及支持较新版本IAsyncEnumerable<>
的 Google.Cloud.Firestore API 的 2.x 版),您可以使用如下代码:
var stream = collection.WhereEqualTo("IsGoodFoo", true).StreamAsync();
await foreach (var document in stream)
{
// Do whatever with the document
}
在我的测试中(使用 900K+ 结果查询),在获取 ~210K 项目后一分钟后超时。 我还不清楚这是否符合预期。
一个更强大的替代方法是使用限制和游标发出查询,直到查询没有检索到该限制。 这是一个例子:
int limit = 1000;
var query = collection.WhereEqualTo("IsGoodFoo", true).Limit(limit);
// Used to specify a cursor
DocumentSnapshot lastDocument = null;
while (true)
{
var queryWithCursor = lastDocument is null ? query : query.StartAfter(lastDocument);
var querySnapshot = await queryWithCursor.GetSnapshotAsync();
foreach (var document in querySnapshot)
{
// Use the document
}
if (querySnapshot.Count != limit)
{
break;
}
}
请注意,虽然您可以指定Offset
而不是使用游标,但当偏移量非常大时,这会显着降低效率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.