调用GetPropertiesOfSecretVersionsAsync提示不存在WhereAwait定义求助
问题原因
你遇到的报错是Azure Key Vault最新SDK的异步枚举类型使用方式不对导致的,核心原因有两个:
GetPropertiesOfSecretVersionsAsync、GetPropertiesOfSecretsAsync这类方法返回类型是AsyncPageable<T>,它实现的是IAsyncEnumerable<T>接口,不是直接返回Task对象,所以不能直接用await关键字修饰方法本身。WhereAwait、OrderByDescendingAwait这类异步LINQ扩展方法不包含在默认SDK依赖中,需要额外安装对应NuGet包才能使用。
解决方案
方案1:使用原生await foreach遍历(无需额外依赖)
C# 8及以上版本支持异步遍历IAsyncEnumerable<T>,你可以直接用这个语法处理结果,不需要安装额外包,兼容性更好:
var validVersions = new List<SecretProperties>(); // 异步遍历所有密钥版本 await foreach (var versionProp in client.GetPropertiesOfSecretVersionsAsync(secret.Name)) { // 过滤启用的版本 if (versionProp.Enabled.GetValueOrDefault()) { validVersions.Add(versionProp); } } // 按创建时间倒序排序 var versions = validVersions.OrderByDescending(p => p.CreatedOn.GetValueOrDefault()).ToList();
方案2:使用异步LINQ扩展方法
如果你要保留原博客的链式写法,需要先安装对应依赖:
- 安装NuGet包:
System.Linq.Async - 确保代码文件引入了
System.Linq命名空间 - 修正直接await方法的错误写法,原链式代码不需要调整即可正常运行:
var versions = await client.GetPropertiesOfSecretVersionsAsync(secret.Name) .WhereAwait(p => new ValueTask<bool>(p.Enabled.GetValueOrDefault() == true)) .OrderByDescendingAwait(p => new ValueTask<DateTimeOffset>(p.CreatedOn.GetValueOrDefault())) .ToListAsync() .ConfigureAwait(false);
补充说明
你调用同步方法没有问题的原因是,同步的GetPropertiesOfSecretVersions等方法返回的是Pageable<T>,实现了同步IEnumerable<T>接口,可以直接用常规LINQ方法处理,和异步返回类型的逻辑完全不同。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

