代码之家  ›  专栏  ›  技术社区  ›  Chris B. Behrens

如何在不使调用链异步的情况下调用applicationTokenProvider?

  •  0
  • Chris B. Behrens  · 技术社区  · 6 年前

    我也有同样的问题:

    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的调用永远不会返回。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tom Sun    6 年前

    我也可以在我的身边复制它。我通过实现自定义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.在当地测试。

    enter image description here