C# KeyVaultClient.AuthenticationCallback未激发

C# KeyVaultClient.AuthenticationCallback未激发,c#,azure,unit-testing,mstest,azure-keyvault,C#,Azure,Unit Testing,Mstest,Azure Keyvault,我想从KeyVault获取机密,但未调用KeyVault Client.AuthenticationCallback 我创建了unittest,即MSTest,我有以下代码: [TestInitialize] public void SetupTest() { CreateKeyvalut(); } public async void CreateKeyvalut() { try {

我想从KeyVault获取机密,但未调用KeyVault Client.AuthenticationCallback

我创建了unittest,即MSTest,我有以下代码:

 [TestInitialize]
    public void SetupTest()
    {
        CreateKeyvalut();
    }

    public async void CreateKeyvalut()
    {
        try
        {
            IKeyVaultClient keyVaultClient = GetKeyVaultClient(_clientId, _certificateThumbprint);

            var password = await GetSecretValueAsync(_secretIdentifier, keyVaultClient);
        }
        catch (Exception ex)
        {
            string errorMessage = $"[KeyVault] Error occurred when trying to connect Key Vault. Exception: {ex}";
            Trace.TraceWarning(errorMessage);

            throw;
        }
    }
    public static IKeyVaultClient GetKeyVaultClient(string clientId, string certificateThumbprint) {
        return new KeyVaultClient(AuthenticationCallback(clientId, certificateThumbprint));
    }

    public static KeyVaultClient.AuthenticationCallback AuthenticationCallback(string clientId, string certificateThumbprint)
    {
        return async (authority, resource, scope) =>
        {
            X509Certificate2 certificate = GetCertificate(certificateThumbprint);
            var context = new AuthenticationContext(authority);
            var clientCredentials = new ClientAssertionCertificate(clientId, certificate);
            AuthenticationResult result = await context.AcquireTokenAsync(resource, clientCredentials).ConfigureAwait(false);
            return result.AccessToken;
        };
    }

    public static async Task<string> GetSecretValueAsync(string secretIdentifier, IKeyVaultClient keyVaultClient)
    {
        var secretTask = await keyVaultClient.GetSecretAsync(secretIdentifier);
        return secretTask.Value;
    }
但它永远不会进入KeyVaultClient.AuthenticationCallback AuthenticationCallback中的代码

有什么问题? 我得到的例外是:

线程0x492c已退出,代码为0 0x0。 testhost.exe警告:0:[KeyVault]尝试连接密钥库时出错。异常:System.Threading.ThreadAbortException:正在中止线程。 在Microsoft.Rest.RetryDelegatingHandler.d_u15.MoveNext -来自引发异常的上一个位置的堆栈结束跟踪-- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotificationTask任务中 在Microsoft.Azure.KeyVault.KeyVaultCredential.d_u13.MoveNext -来自引发异常的上一个位置的堆栈结束跟踪-- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotificationTask任务中 在Microsoft.Azure.KeyVault.KeyVaultClient.d_u65.MoveNext -来自引发异常的上一个位置的堆栈结束跟踪-- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotificationTask任务中 在Microsoft.Azure.KeyVault.KeyVaultClientExtensions.d_u13.MoveNext -来自引发异常的上一个位置的堆栈结束跟踪-- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotificationTask任务中 在System.Runtime.CompilerServices.TaskWaiter1.GetResult 在d__24.下一个进来 -来自引发异常的上一个位置的堆栈结束跟踪-- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotificationTask任务中 在System.Runtime.CompilerServices.TaskWaiter1.GetResult 在C:\MyProject\src\test\testValidation.cs中的d\uu 18.MoveNext:第41行


我使用了完全相同的代码,它是在AuthenticationCallBack函数中单步执行的。请检查屏幕截图

由于凭据问题,似乎回调函数抛出错误

**at Microsoft.Azure.KeyVault.KeyVaultCredential.d__13.MoveNext()**
请检查凭据/证书并尝试调试回拨功能


希望有帮助。

您可以尝试使用公共异步任务SetupTest,等待对CreateKeyvalut的调用,并将CreateKeyvalut函数的定义更改为公共异步任务CreateKeyvalut吗?这里的解释太长了,但您可以参考这篇文章来了解异步任务和异步void:对我来说,它适用于本地开发环境,在一些服务器上。即使它是以自包含的形式发布的,但在其他服务器上也会失败。