К сожалению, клиент KeyVault предназначен для возврата Задачи с KeyVaultErrorException в случае, если секрет не существует вместо сообщения об ошибке \ result.
В вашем случае он взрывается, потому что при вызове .Result
он разворачивает исключение внутри Задачи и нарушает поток выполнения.
Лучший способ получить секрет в KeyVault - это обернуть логику в блок Try \ Catch, как показано ниже:
try
{
var secret = await client.GetSecretAsync(secretPath);
//... any other logic here ...
}
catch (KeyVaultErrorException kvex)
{
//handle key not found here
}
catch (HttpRequestException ex)
{
//handle any other error here if needed
}
Чтобы упростить работу с keyvault, я обычно создаю класс для обработки этой логики, например:
public class SecretManager
{
KeyVaultClient client;
public SecretManager(KeyVaultClient client){ this.client = client; }
public Task<string> GetSecretAsync(string secretName){
//here I wrap the logic mentioned above
}
}
.
Вышеуказанный фрагмент кода сверху внизмоя голова, не копия из производственного кода
Если вы используете логику, подобную приведенной выше, вместо того, чтобы выбрасывать исключение для секрета не найдено, вы делаете правильную обработку исключений и возвращаетенулевое значение или значение, представляющее не найденный секрет, тогда вы сможете развернуть результаты, как ожидалось.