【问题标题】:Microsoft Graph SDK .NET - get users with managers and extra fieldsMicrosoft Graph SDK .NET - 让用户拥有管理器和额外字段
【发布时间】:2019-06-11 10:36:18
【问题描述】:

我想在我的 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();

在对每个用户发出此请求后,ManagerEmployeeId 字段都为空。我可以使用带有 /?select=extension_88b64915d0de49799c8e36460702b34d_employeeNumber 参数和相同身份验证令牌的 /manager 和 /user 端点直接从 API 获取这些信息,但我想使用 SDK 并发出单个请求。

如何使用 SDK 在一个请求中执行此操作?

【问题讨论】:

    标签: .net .net-core microsoft-graph-api microsoft-graph-sdks


    【解决方案1】:

    我一直在寻找 Microsoft Graph SDK 类和方法,但运气不佳。无论如何,如果在您的 Microsoft Graph SDK 类和方法中,您没有找到任何可以在单个操作中为您执行此操作的内容,因为 SDK 和 API 中的方法旨在具有单一的责任(如果方法获得用户,它将不会做任何事情否则就像得到它的经理)。另外我读到 SDK 总是有点落后于 API 当前状态,如果你想访问最新的功能,你应该使用 httpClient。

    解决方案:使用所需的逻辑实现您自己的方法,并使用当前的 SDK 方法或使用 httpClient 调用 Graph API 填充您需要的信息

    我找到了几个您可能熟悉的示例: https://developer.microsoft.com/en-us/graph/graph-explorer

    【讨论】:

    • 有没有办法让所有用户和他们的经理在 1 个请求中获得 Graph API?我知道我可以获取所有用户,然后为每个用户获取管理员,但这不是一个有效的解决方案。
    • 回答我正在寻找 SDK 方法(不是 API)的完整列表,然后您可以浏览 arround 并查看它是否已经存在。
    【解决方案2】:

    不幸的是,目前不支持通过单个请求来检索用户和管理员,但可以考虑使用以下方法:

    a) 通过List users endpoint 提交第一个检索用户的请求

    b) 构造并提交batch request 以通过List manager endpoint 检索用户的经理:

    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 批处理的支持。

    【讨论】:

      【解决方案3】:

      你可以试试这个。

       var users = await client.Users.Request()
                      .Expand(u=>u.Manager)
                      .Filter("accountEnabled eq true")
                      .Select(u=>new 
                      {
                          u.Id,
                          u.GivenName,
                          u.Surname,
                          u.DisplayName,
                          u.Mail,
                          u.JobTitle,
                          u.Department,
                          u.EmployeeId,
                          u.EmployeeType,
                          u.BusinessPhones,
                          u.MobilePhone,
                          u.Photo,
                          u.AccountEnabled,
      
                          u.Manager
                      })
                      .GetAsync();
      

      访问https://docs.microsoft.com/en-us/graph/sdks/create-requests?tabs=CS#use-expand-to-access-related-entities,查看使用 Expand 访问相关实体的示例。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多