Azure Graph API没有响应

时间:2018-07-31 18:03:45

标签: azure async-await azure-active-directory azure-ad-graph-api

我正在尝试调用Azure Graph API来更新用户详细信息,我已经验证了从Azure中的应用程序对graph api的访问。下面是我的代码

public async Task<HttpResponseMessage> UpdateUserDetails(string userId, string requestString)
    {
        if (string.IsNullOrEmpty(userId))
        {
            throw new ArgumentException("You must spectify a valid user Id", nameof(userId));
        }

        if(string.IsNullOrWhiteSpace(requestString))
        {
            return null;
        }

        var authContext = new AuthenticationContext(AzureAdConfig.Authority);
        var getAccessToken = await authContext.AcquireTokenAsync(AzureAdConfig.GraphResourceId, new ClientCredential(AzureAdConfig.AppId, AzureAdConfig.AppKey));

        var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", getAccessToken.AccessToken);
        string url = AzureAdConfig.GraphResourceId + AzureAdConfig.Tenant + "/users/" + userId + "?" + AzureAdConfig.GraphVersion;

        HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("PATCH"), url);
        request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", getAccessToken.AccessToken);

        request.Content = new StringContent(requestString, Encoding.UTF8, "application/json");
        HttpResponseMessage response = await client.SendAsync(request);
        return response;
    }

预先感谢

1 个答案:

答案 0 :(得分:-1)

根据我的测试,您无法在控制台应用程序中使用await client.SendAsync(request)获得HttpResponseMessage。您应该使用client.SendAsync(request).Result来获取HttpResponseMessage。这是我的代码。 静态void Main(string [] args)         {

       Console.WriteLine( CallWebApiProtected("2778d832-402f-4bc2-aa28-0720c92947d5"));
        Console.Read();


    }



    static HttpResponseMessage CallWebApiProtected(string userId)
    {


        string authority = "https://login.microsoftonline.com/e4c9ab4e-bd27-40d5-8459-230ba2a757fb/oauth2/token"; //token endpoint https://login.microsoftonline.com/b29343ba-***/oauth2/token
        string resourceUri = "https://graph.windows.net/";
        string clientId = "6187f317-5f3c-447e-b0c4-1fd7c31ec14e";//your application id
        string clientkey = "q6e2d7xPwfa5rWHDCV5Tv/75wVkAnsinAcgF5FFkf7Y=";//your app key


        AuthenticationContext authContext = new AuthenticationContext(authority);
        ClientCredential clientCredential = new ClientCredential(clientId, clientkey);
        AuthenticationResult authenticationResult = authContext.AcquireTokenAsync(resourceUri, clientCredential).Result;


        var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);
        var queryString = HttpUtility.ParseQueryString(string.Empty);
        // Specify values for the following required parameters
         queryString["api-version"] = "1.6";
        // Specify values for path parameters (shown as {...})
        var uri = "https://graph.windows.net/e4c9ab4e-bd27-40d5-8459-230ba2a757fb/users/" +userId + "?" + queryString;

        Console.WriteLine(uri);
        using (var request = new HttpRequestMessage())
        {
            request.Method = HttpMethod.Get;
            request.RequestUri = new Uri(uri);
            //request.Content = new StringContent(postBody, Encoding.UTF8, "application/json");
            request.Headers.Add("Authorization", "Bearer " + authenticationResult.AccessToken);

            HttpResponseMessage response = client.SendAsync(request).Result;
            return response;



        }

其结果如下。 enter image description here

此外,您还可以使用await客户端获取HttpResponseMessage。Web应用程序中的SendAsync(request)。这是我的代码。

public async System.Threading.Tasks.Task<ActionResult> About()
    {

        HttpResponseMessage response = await CallWebApiProtected("2778d832-402f-4bc2-aa28-0720c92947d5");

        ViewBag.Message = response;

        return View();
    }
    static async System.Threading.Tasks.Task<HttpResponseMessage>  CallWebApiProtected(string userId)
    {


        string authority = "https://login.microsoftonline.com/e4c9ab4e-bd27-40d5-8459-230ba2a757fb/oauth2/token"; //token endpoint https://login.microsoftonline.com/b29343ba-***/oauth2/token
        string resourceUri = "https://graph.windows.net/";
        string clientId = "6187f317-5f3c-447e-b0c4-1fd7c31ec14e";//your application id
        string clientkey = "q6e2d7xPwfa5rWHDCV5Tv/75wVkAnsinAcgF5FFkf7Y=";//your app key


        AuthenticationContext authContext = new AuthenticationContext(authority);
        ClientCredential clientCredential = new ClientCredential(clientId, clientkey);
        AuthenticationResult authenticationResult = authContext.AcquireTokenAsync(resourceUri, clientCredential).Result;
        Console.WriteLine("--------------------------------");
        Console.WriteLine(authenticationResult.AccessToken);
        Console.WriteLine("----------------------------");

        var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);
        var queryString = HttpUtility.ParseQueryString(string.Empty);




        // Specify values for the following required parameters
        queryString["api-version"] = "1.6";
        // Specify values for path parameters (shown as {...})
        var uri = "https://graph.windows.net/e4c9ab4e-bd27-40d5-8459-230ba2a757fb/users/" + userId + "?" + queryString;

        Console.WriteLine(uri);
        using (var request = new HttpRequestMessage())
        {
            request.Method = HttpMethod.Get;
            request.RequestUri = new Uri(uri);
            //request.Content = new StringContent(postBody, Encoding.UTF8, "application/json");
            request.Headers.Add("Authorization", "Bearer " + authenticationResult.AccessToken);

            HttpResponseMessage response = await client.SendAsync(request);
            return response;



        }


    }

其结果如下。 enter image description here