【问题标题】:How can I call ApplicationTokenProvider without making my call chain async?如何在不使调用链异步的情况下调用 ApplicationTokenProvider?
【发布时间】:2018-05-30 17:10:12
【问题描述】:

我和这个问题有同样的问题:

Call to ApplicationTokenProvider never returns

解决方案是使调用方法异步,并且可能在其之上的每个调用都是异步的。我在调用链中深入了解了这个方法(在测试工具中工作正常),并且在 MVC 控制器中调用时无法返回。我不想让它上面的每个调用都异步 - 这需要大量的重新设计和丑陋的架构来引入对我的代码无用的异步功能。

当然有一些方法可以让 #$(* 同步工作?这是我目前的代码:

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

    MonitorClient = monitorClient;
}

第三行对 LoginSilentAsync 的调用永远不会返回。

【问题讨论】:

    标签: c# asp.net-mvc azure


    【解决方案1】:

    我也可以在我身边复制它。我通过实现自定义 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.把你的Authenticate函数改成下面的代码。

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

    3.在本地测试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-18
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多