Как я могу вызвать ApplicationTokenProvider, не делая мою цепочку вызовов асинхронной? - PullRequest
0 голосов
/ 30 мая 2018

У меня та же проблема, что и у этого вопроса:

Вызов ApplicationTokenProvider никогда не возвращает

Решение состоит в том, чтобы сделать вызывающий метод асинхронным, и, вероятно, каждый вызоввыше это асинхронно.У меня есть этот метод глубоко в цепочке вызовов (он отлично работает в тестовом жгуте) и не может вернуться при вызове в контроллере MVC.Я не хочу делать каждый вызов выше этого асинхронным - это потребовало бы большого количества редизайна и уродливой архитектуры, чтобы внедрить асинхронные возможности, которые бесполезны для моего кода.

Конечно, есть какой-то способ сделать это просто# $ (* & # работают синхронно? Вот мой код в настоящее время:

public void Authenticate()
{
    var serviceCreds = ApplicationTokenProvider.LoginSilentAsync(TenantId, ApplicationId, Secret).Result;
    var monitorClient = new MonitorManagementClient(serviceCreds) {SubscriptionId = SubscriptionId.ToString()};

    MonitorClient = monitorClient;
}

Вызов на третьей строке LoginSilentAsync никогда не возвращается.

1 Ответ

0 голосов
/ 31 мая 2018

Я также могу воспроизвести его на тайне.Я решил это путем реализации пользовательских ServiceClientCredentials.Следующий демонстрационный код.

 public class CustomCredentials : ServiceClientCredentials
    {
        private string AuthenticationToken { get; set; }

        public override void InitializeServiceClient<T>(ServiceClient<T> client)
        {
            var authenticationContext =
                new AuthenticationContext("https://login.windows.net/yourtenantId");
            var credential = new ClientCredential("clientid", clientSecret: "secret key");

            var result = authenticationContext.AcquireTokenAsync("https://management.azure.com/",
                credential).Result;

            if (result == null)
            {
                throw new InvalidOperationException("Failed to obtain the JWT token");
            }

            AuthenticationToken = result.AccessToken;
        }
    }

2.Замените функцию проверки подлинности на следующий код.

 public void Authenticate()
        {
            var monitorClient = new MonitorManagementClient(new CustomCredentials()) { SubscriptionId = "subscription Id" };
            MonitorClient = monitorClient;
        }

3.Проверьте ее в местном режиме.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...