【问题标题】:Azure CosmosDB SDK v3 with ASP.NET Web Forms带有 ASP.NET Web 窗体的 Azure CosmosDB SDK v3
【发布时间】:2019-08-22 08:07:28
【问题描述】:

以下代码存在问题,在控制台应用程序项目中运行良好,但在 ASP.NET Web 窗体项目中运行不正常,两者都针对 .NET Framework 4.7.2。

目标是使用最后一个 Azure Cosmos DB SDK (v3) 来获取容器中的所有文档,而不指定类型(使用动态)。

我尝试同时针对模拟器(最新版本 2.4.5)和 Azure Cosmos 服务。

在 ASP.NET 项目中,queryResultSetIterator.ReadNextAsync().Result 的执行永远不会结束(没有超时)。

string endpointUri = "https://localhost:8081";
string primaryKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";
string database = "SendGridEvents";
string collection = "SendGridEvents";
using (CosmosClient client = new CosmosClient(endpointUri, primaryKey))
{
    Container container = client.GetDatabase(database).GetContainer(collection);

    QueryDefinition queryDefinition = new QueryDefinition("SELECT * FROM c");
    FeedIterator<dynamic> queryResultSetIterator = container.GetItemQueryIterator<dynamic>(queryDefinition);
    List<dynamic> documents = new List<dynamic>();
    while (queryResultSetIterator.HasMoreResults)
    {
        FeedResponse<dynamic> currentResultSet = queryResultSetIterator.ReadNextAsync().Result;
        foreach (var document in currentResultSet)
        {
            documents.Add(document);
        }
    }
}

【问题讨论】:

    标签: c# asp.net azure webforms azure-cosmosdb


    【解决方案1】:

    这是由于使用有问题的.Result导致死锁。

    有无数来源可以解释这种死锁,但我会从 StackOverflow 链接 this answer

    TL;DR 是您正在阻止导致死锁的 UI 线程中的异步调用。您需要像这样正确地等待您的电话:

    FeedResponse&lt;dynamic&gt; currentResultSet = await queryResultSetIterator.ReadNextAsync();

    如果您使用ConfigureAwait(false) 方法,您可以在技术上阻止调用,但 v3 SDK 不会将此调用一直级联到网络调用,因此不会有任何区别。 WebForms 允许您拥有异步处理程序,因此您可以使您的方法异步并重试。

    【讨论】:

    • 感谢您的解释。让一切异步是我的第一个计划,但我认为 ASP.NET 4.5 模型绑定机制不支持异步。我错了,因为它从 4.6 开始工作。参照devblogs.microsoft.com/aspnet/…
    • 另外,请不要使用using。在应用程序的整个生命周期内维护 CosmosClient 的单例实例。
    • 实际上,这是 HttpRequest 中对 CosmosDB 客户端的唯一调用,所以我无法分享,但感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2012-01-23
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多