Microsoft Graph SDK .NET - получите пользователей с менеджерами и дополнительными полями

Я хочу получить всех пользователей графиков с их менеджерами и некоторыми нестандартными полями в моем приложении ASP.NET Core 2.2. Для этого я написал следующий код:

        graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider(async request =>
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("bearer", await tokenProvider.GetToken());
        }));

        var page = await graphServiceClient.Users
            .Request()
            .Expand(e => e.Manager)
            .Select(e => new
            {
                e.Department,
                e.OfficeLocation,
                e.JobTitle,
                e.UserPrincipalName,
                e.Mail,
                e.GivenName,
                e.DisplayName,
                e.Surname,
                e.MobilePhone,
                e.Id,
                e.EmployeeId
            })
            .GetAsync();

После этого запроса для каждого пользователя поля Manager и EmployeeId будут пустыми. Я могу получить эту информацию непосредственно из API, используя конечные точки / manager и / user с параметром /? Select = extension_88b64915d0de49799c8e36460702b34d_employeeNumber с тем же токеном аутентификации, но я хочу использовать SDK и сделать один запрос.

Как я могу сделать это одним запросом с помощью SDK?


person Peace    schedule 11.06.2019    source источник


Ответы (2)


Я безуспешно искал классы и методы Microsoft Graph SDK. В любом случае, если в ваших классах и методах SDK Microsoft Graph вы не нашли ничего, что делало бы это за вас за одну операцию, это связано с тем, что методы в SDK и API предназначены для единой ответственности (если метод получает пользователей, он ничего не сделает остальное вроде достать свои менеджеры). Также я читал, что SDK всегда немного отстает от текущего статуса API, и если вы хотите получить доступ к последним функциям, вы должны использовать httpClient.

Решение: реализуйте свой собственный метод с необходимой логикой и заполните необходимую информацию, используя текущие методы SDK или используя httpClient для вызова Graph API.

Я нашел пару примеров, которые, вероятно, вам знакомы: https://developer.microsoft.com/en-us/graph/graph-explorer

person Mauricio Gracia Gutierrez    schedule 11.06.2019
comment
Есть ли способ собрать всех пользователей вместе с их менеджерами в 1 запрос к Graph API? Я знаю, что могу получить всех пользователей, а затем менеджера для каждого из них, но это не эффективное решение. - person Peace; 12.06.2019
comment
Чтобы ответить на этот вопрос, я искал полный список методов SDK (не API), а затем вы можете просмотреть его и посмотреть, есть ли он там. - person Mauricio Gracia Gutierrez; 12.06.2019

К сожалению, получение пользователей вместе с менеджерами в настоящий момент не поддерживается с помощью одиночного запроса, но вместо этого можно рассмотреть следующий подход:

а) отправьте первый запрос на получение пользователей через _ 1_ конечная точка

б) создать и отправить пакетный запрос для получения менеджеров пользователя через < a href = "https://docs.microsoft.com/en-us/graph/api/user-list-manager?view=graph-rest-1.0&tabs=cs" rel = "nofollow noreferrer"> _ 2_ конечная точка :

POST https://graph.microsoft.com/v1.0/$batch
Accept: application/json
Content-Type: application/json

{
  "requests": [
    {
      "id": "1",
      "method": "GET",
      "url": "/users/{id1 | userPrincipalName1}/manager"
    },
    {
      "id": "2",
      "method": "GET",
      "url": "/users/{id2 | userPrincipalName2}/manager"
    },
    //...
   ]
}

Вот пример для msgraph-sdk-dotnet:

//1. get user properties 
var users = await graphClient.Users
     .Request()
     .Select(e => new
                {
                    e.Department,
                    e.OfficeLocation,
                    e.JobTitle,
                    e.UserPrincipalName,
                    e.Mail,
                    e.GivenName,
                    e.DisplayName,
                    e.Surname,
                    e.MobilePhone,
                    e.Id,
                    e.EmployeeId
                })
      .GetAsync();


//2 get user's managers
var batchRequest = new BatchRequest();
foreach (var user in users)
{             
    batchRequest.AddQuery(graphClient.Users[user.UserPrincipalName].Manager.Request(), typeof(Microsoft.Graph.User));
}
var managers = await graphClient.GetBatchAsync(batchRequest);
foreach(var manager in managers)
{
   if (manager != null)
   {
       //...
   }
}

где BatchRequest class - это настраиваемый класс, который реализует поддержку пакетной обработки JSON.

person Vadim Gremyachev    schedule 12.06.2019