c# – KeyVault GetSecretAsync永远不会返回

在Web应用程序中使用keyvault的示例代码中包含以下代码

public static async Task<string> GetSecret(string secretId)
{
    var secret = await keyvaultClient.GetSecretAsync(secretId);
    return secret.Value;
}

我已将示例中包含的keyvaultAccessor对象合并到我的应用程序中以进行测试.该调用作为对我的一个web api控制器方法查询的一部分执行:

var secret = keyvaultAccessor.GetSecret("https://superSecretUri").Result;

不幸的是,调用永远不会返回,查询将无限期挂起……

可能是什么原因,因为坦白说我不知道​​从哪里开始……?

解决方法

这是我 describe in full on my blog的常见死锁问题.简而言之,异步方法在await完成后尝试返回到ASP.NET请求上下文,但该请求一次只允许一个线程,并且已经有一个线程该上下文(在调用Result时被阻止的上下文).因此任务正在等待上下文自由,并且线程阻止上下文直到任务完成:死锁.

正确的解决方案是使用await而不是Result:

var secret = await keyvaultAccessor.GetSecret("https://superSecretUri");

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...