API-код Microsoft Graph в C# отображает только ограниченное количество пользователей - PullRequest
0 голосов
/ 18 февраля 2020

Я использую код ниже Microsoft Graph Api:

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace AADConsole2
{
    class Program
    {

        private const string aadInstance = "https://login.microsoftonline.com/{0}";
        //  private const string ResourceUrl = "https://graph.windows.net";

        private const string resource = "https://graph.microsoft.com";
        private const string GraphServiceObjectId = "XXX";
        private const string TenantId = "XXX";
        private const string tenant = "XXXX.onmicrosoft.com";
        private const string ClientId = "XXX";
        private static string appKey= "XXXX";
        static string authority = String.Format(System.Globalization.CultureInfo.InvariantCulture, aadInstance, tenant);

        private static HttpClient httpclient = new HttpClient();
        private static AuthenticationContext context = null;
        private static ClientCredential credential = null;


        static void Main(string[] args)
        {

            context = new AuthenticationContext(authority);
            credential = new ClientCredential(ClientId, appKey);
            Task<string> token = GetToken();
            token.Wait();
            Console.WriteLine(token.Result);
            Task<string> users = GetUsers(token.Result);
            users.Wait();
            Console.WriteLine(users.Result);
            Console.ReadLine();
        }

        private static async Task<string> GetUsers(string result) {
            //throw new NotImplementedException();
            string users = null;
            var uri = "https://graph.microsoft.com/v1.0/users";
            httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result);
            var getResult = await httpclient.GetAsync(uri);

            if(getResult.Content != null)
            {
                users = await getResult.Content.ReadAsStringAsync();

            }
            return users;

        }


        private static async Task<string> GetToken()
        {
            AuthenticationResult result = null;
            string token = null;
            result = await context.AcquireTokenAsync(resource, credential);
            token = result.AccessToken;
            return token;



        }
    }
}

Я получаю результаты пользовательских данных, напечатанные на консоли, но напечатано только ограниченное число пользователей. т.е. только чье имя начинается с буквы «а». А также отсутствуют некоторые детали пользователя. Как получить все данные пользователя. Я пропустил некоторые API в этом коде? Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Примерно так получат все ваши пользователи. Также, если вы хотите, чтобы свойства были вне значений по умолчанию, вам нужно указать их с помощью выбора. Не все свойства возвращаются по умолчанию.

            String Properties = "Comma Separated List of Properties You actaully Need";
            List<User> AllUsers = new List<User>();
            IGraphServiceUsersCollectionPage users = graphServiceClient.Users
                                                        .Request()
                                                        .Select(Properties)
                                                        .GetAsync()
                                                        .Result;

            do
            {
                QueryIncomplete = false ;
                AllUsers.AddRange(users);
                if (users.NextPageRequest != null)
                {
                    users = users.NextPageRequest.GetAsync().Result;
                    QueryIncomplete = true;
                }

            }while (QueryIncomplete);

            return AllUsers;
0 голосов
/ 18 февраля 2020

Большинство конечных точек Microsoft Graph возвращают постраничные наборы результатов. Ваш первоначальный запрос возвращает только первую страницу данных. Чтобы получить следующую страницу, вы должны следовать URI, указанному в свойстве @odata.nextLink. Каждая последующая страница будет возвращать @odata.nextLink на следующей странице до последней страницы данных (что обозначено отсутствием @odata.nextLink в результате). Существует пошаговое руководство о том, как это работает, при Размещении данных Microsoft Graph в вашем приложении .

Самый важный совет, который я могу вам здесь дать, - , а не , используйте $top, чтобы заставить его возвращать большие страницы данных. Это крайне неэффективный метод вызова API и неизбежно приводит к сетевым ошибкам и регулированию запросов. Это также не устраняет необходимость обработки подкачки, поскольку даже $top=999 (максимум) может возвращать несколько страниц.

Внедрите подкачку страниц, сохраняйте размер страницы небольшим и обрабатывайте результаты после каждой страницы, прежде чем переходить на следующую страницу. Это гарантирует, что вы захватите все данные и , и ваше приложение сможет выбрать, где оно остановилось, если оно обнаружит какие-либо ошибки во время обработки.

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