【发布时间】:2019-10-29 17:48:59
【问题描述】:
我在 WebApi 中有一个方法,该方法通过返回进程配置文件但永远不会返回的 SQL API 调用 Cosmos。任务挂起并且永远不会完成。我可以在 Debug 的 Threads 窗口中看到该任务。对同一数据库容器的其他调用运行良好。几次通话后,我必须重新启动 IIS 以清除任务。不抛出异常。我已经在有和没有尝试捕获的情况下运行它。复制到另一个控制台应用程序项目中的相同方法可以正常工作。是否存在已知的 cosmos 超时导致结果过大的问题?这应该只返回 2 个项目。实时 Cosmos DB 和本地运行的 Cosmos 模拟器的行为相同。
我正在使用最新的 Cosmos 包。
<package id="Microsoft.Azure.Cosmos" version="3.3.2" targetFramework="net472" />
构造函数
client = new CosmosClient(url, primaryKey, new CosmosClientOptions()
{
RequestTimeout = new TimeSpan(0, 0, 20),
ApplicationRegion = "West US 2",
ConnectionMode = ConnectionMode.Gateway,
GatewayModeMaxConnectionLimit = 1000,
MaxRetryAttemptsOnRateLimitedRequests = 1000,
});
database = client.GetDatabase("MyDatabase");
container = configDatabase.GetContainer("Configs");
此方法永远不会从等待项中返回。ReadNextAsync()
public async Task<Dictionary<int, string>> GetConfigurationList()
{
var values = new Dictionary<int, string>();
var query = new QueryDefinition("SELECT c.ConfigId, c.ConfigDescription FROM c where c.DataSourceType='CSV'");
var items = container.GetItemQueryIterator<(int ConfigId, string ConfigDescription )>(query);
while (items.HasMoreResults)
{
FeedResponse<(int ConfigId, string ConfigDescription )> configs = await items.ReadNextAsync();
foreach (var item in configs)
{
values.Add(item.ConfigId, item.ConfigDescription);
}
}
return values;
}
这个方法每次都很好用
public async Task<LetterConfiguration> GetConfiguration(int id)
{
var query = new QueryDefinition("SELECT * FROM c where c.ConfigId= @id").WithParameter("@id",id);
var configItems = container.GetItemQueryIterator<ConfigFile>(query);
while (configItems.HasMoreResults)
{
FeedResponse<ConfigFile> configs = await configItems.ReadNextAsync();
if(configs.Count == 1)
{
return configs.FirstOrDefault();
}
}
return null;
}
【问题讨论】:
-
如果在方法
GetConfigurationList中使用类型化对象,即ConfigFile而不是Tuple,会发生什么情况。还有一些其他问题 - 您正在开发的应用程序是什么?在链中的任何地方,您的代码是否破坏了异步/等待模式?建议使用ConfigureAwait(false)进行异步调用。 -
使用类型化的对象做同样的事情。我试图 Tuple 看看这是否是数据量问题。 async/await 用于从控制器到它所在的存储库。该应用程序用于生成套用信函。 ConfigFiles 定义了如何在不同的表单上填充数据。我尝试了 ConfigureAwait(false),它仍然没有返回。
-
如果在 Web API 方法的末尾(最后一行)添加断点,它会被命中吗?如果是这样,您可能会在某处丢失一些
await并丢失异步上下文 -
断点永远不会被命中,调用者(swagger UI、邮递员)的请求永远不会完成。
-
@kekindt - 当您直接在 Comos DB 查询刀片(在 Azure 门户中)运行此查询时,查询会产生任何结果吗?
标签: c# azure azure-cosmosdb