首页 > 解决方案 > 从 Azure Key Vault 检索机密:任务还是常规字符串?

问题描述

我有两种方法可以从我的保险库中检索秘密。一个是异步的,而另一个不是。

异步:

public static async Task<string> GetSecret(string secretName)
    {
        try
        {
            return (await GetClient().GetSecretAsync("VaultURL", secretName)).Value;
        }

        catch (Exception ex)
        {
            return ex.Message;
        }
    }

非异步:

      public static string GetSecretWithoutAwait(string SecretName)
    {
        var azureServiceTokenProvider = new AzureServiceTokenProvider();
        var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
        return keyVaultClient.GetSecretAsync("vaultUrl", SecretName).Result.Value;
    }

没有异步方法最适合我的需要,如果可能的话,我更喜欢保持这种方式。使检索成为非异步过程的后果是什么?

标签: azure-keyvault

解决方案


使检索成为非异步过程的后果是什么?

Result成员只存在于Task<T>类型上;Task它在类型上不存在。

和 Wait 一样,Result 会同步阻塞调用线程,直到任务完成。这通常不是一个好主意,原因与 Wait 不是一个好主意的原因相同:很容易导致死锁

如果您必须阻止等待Async任务的完成,请使用GetAwaiter().GetResult(). Wait并将Result任何异常包装在 中AggregateException,这会使错误处理复杂化。的优点GetAwaiter().GetResult()是它返回一个正常的异常而不是一个AggregateException.

所以我建议你使用 Async 方法来检索秘密


推荐阅读