MS Graph SDK手动调用API后,如何填充ApplicationCollectionResponse的Value属性?
问题:手动构造Graph API请求后Value属性为空的处理方法
当仅知晓appId时,提取应用注册和服务主体需在URI后追加(appId='appId')。由于无法直接修改原始URI,因此使用RequestInformation与RequestAdapter.SendAsync获取信息,代码如下:
var requestInfo = graphServiceClient.Applications.ToGetRequestInformation(); var fixedUri = $"{requestInfo.URI}(appId='<my app id here>')"; requestInfo.URI = new Uri(fixedUri); var apps = await graphServiceClient.RequestAdapter.SendAsync(requestInfo, ApplicationCollectionResponse.CreateFromDiscriminatorValue).ConfigureAwait(false);
调用成功后,结果变量的Value属性为空,无法获取解析后的Application对象,但在apps.AdditionalData中可见应用的数据字典。已知graphServiceClient.ApplicationsWithAppId和graphServiceClient.ServicePrincipalWithAppId的解决方案,希望了解手动方式下填充Value属性的方法。
手动填充Value属性的解决方案
问题根源
使用(appId='xxx')这种OData筛选方式时,Graph API返回的是单个Application对象(而非标准集合响应的数组结构),而ApplicationCollectionResponse期望绑定的是{"value": [/*数组*/]}格式的响应,因此解析后Value属性为空,原始数据会被存入AdditionalData。
方法1:从AdditionalData中手动解析并填充Value
从AdditionalData中取出原始JSON数据,序列化为Application实例后赋值给Value:
// 检查AdditionalData中的顶层数据,通常直接对应单个应用的JSON结构 if (apps.AdditionalData.Values.FirstOrDefault() is JsonElement appJsonElement) { // 反序列化为Application对象 var application = JsonSerializer.Deserialize<Application>( appJsonElement.GetRawText(), new JsonSerializerOptions { PropertyNameCaseInsensitive = true } ); // 将解析后的对象填充到Value属性中 apps.Value = new List<Application> { application }; }
方法2:改用单个Application的响应解析器
既然请求返回的是单个对象,直接使用Application的解析器而非集合响应解析器,无需处理Value属性:
var requestInfo = graphServiceClient.Applications.ToGetRequestInformation(); var fixedUri = $"{requestInfo.URI}(appId='<my app id here>')"; requestInfo.URI = new Uri(fixedUri); // 使用Application的CreateFromDiscriminatorValue作为解析器 var app = await graphServiceClient.RequestAdapter.SendAsync( requestInfo, Application.CreateFromDiscriminatorValue ).ConfigureAwait(false); // 此时app即为解析完成的单个Application对象
内容的提问来源于stack exchange,提问作者Stephan Steiner
相关产品推荐
相关产品推荐

