澄清如何使用Microsoft.Graph Client

时间:2016-04-21 13:18:35

标签: c# azure office365 azure-active-directory microsoft-graph

以下代码是我到目前为止使用Microsoft Graph Client Library

更新对象的唯一方法

情景:

  1. 加载现有对象(组织)
  2. 修改值(在securityComplianceNotificationPhones中添加条目)
  3. 发送更新
  4. 代码

    var client = new GraphServiceClient(...);
    
    var org = client.Organization["orgid"].Request().GetAsync().Result;
    var secPhones = new List<string>(org.SecurityComplianceNotificationPhones);
    secPhones.Add("12345");
    
    var patchOrg = new Organization();
    patchOrg.SecurityComplianceNotificationPhones = secPhones;
    
    var orgReq = new OrganizationRequest(
         client.Organization[org.Id].Request().RequestUrl,
         client, new Option[] {});
    orgReq.UpdateAsync(patchOrg).Wait();
    

    我需要使用 patchOrg 实例,因为有两件事:

    1. Graph API documentation个州

        

      &#34;在请求正文中,提供相关字段的值   应该更新。未包含在内的现有属性   请求正文将保持其先前的值或重新计算   基于对其他属性值的更改。为了获得最佳性能   不应该包含尚未改变的现有价值。&#34;

    2. 如果您确实执行包含尚未更改的现有值 (即assginedLicenses)请求失败,如果那些现有值 只读。

    3. 我的问题是:是否有更简单的方法来更新现有对象,例如Azure ActiveDirectory GraphClient?仅用于比较,Azure Active Directory图中的相同方案

      var client = new ActiveDirectoryClient(...);
      var org = client.TenantDetails.GetByObjectId("orgid").ExecuteAsync().Result;
      org.SecurityComplianceNotificationPhones.Add("12345");
      org.UpdateAsync().Wait();
      

1 个答案:

答案 0 :(得分:5)

Graph客户端库模型与您链接的AAD客户端库的旧SDK模型略有不同。较旧的模型传递了试图变得更聪明的对象以及更改哪些属性的原因,只发送了那些属性。这个模型的一个主要缺点是,库在后台进行了更多的服务调用,并且在每次调用中都有更重的负载,因为ExecuteAsync()通常需要检索请求构建器链中的每个对象。较新的库确实要求开发人员对传递的数据做更明确的推理,同时还要更好地控制网络调用和负载。每种模型都有其权衡。

要实现您想要的目标,我建议使用的方法,而不是完全创建第二个组织对象:

var client = new GraphServiceClient(...);

var orgRequest = client.Organization["orgid"].Request();
var org = orgRequest.Select("securityComplianceNotificationPhones").GetAsync().Result;

var secPhones = new List<string>(org.SecurityComplianceNotificationPhones);
secPhones.Add("12345");

org.SecurityComplianceNotificationPhones = secPhones;

orgRequest.UpdateAsync(org).Wait();