我正在使用Microsoft Graph通过以下代码检索联系人文件夹:
GraphServiceClient client = new GraphServiceClient(new DelegateAuthenticationProvider(
(requestMessage) => {
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);
return Task.FromResult(0);
}));
var contactsData = await client
.Me
.Contacts
.Request()
.Top(1000)
.GetAsync();
上面的代码返回“联系人”,但仅返回默认文件夹中的“联系人”。我想从用户的所有文件夹中检索联系人。
我试图先获取文件夹,然后再获取其联系人,但是由于联系人为Null Reference Exception
,因此它返回null
。
var Folders = client
.Me
.ContactFolders
.Request()
.Top(1000)
.GetAsync();
Folders.Wait();
var contacts = Folders.Result.SelectMany(a => a.Contacts).ToList();
答案 0 :(得分:0)
我现在没有在此计算机上进行测试的环境,但是据我了解,您可以使用选项查询参数来过滤subFolders中的联系人。
您需要找出所有子文件夹
GET / users / {id | userPrincipalName} / contactFolders
在每个子文件夹中查找联系人
获取/ me / contactFolder / {id} / childFolders / {id} /联系人
有关更多“联系人”文件夹和联系人相关信息。请阅读这些文档。 https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_list_contactfolders https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_list_contacts
答案 1 :(得分:0)
首先,此示例代码是在.net核心中创建的,您应该通过以下代码在配置中设置GraphScopes:
"GraphScopes": "User.Read User.ReadBasic.All Mail.Send MailBoxSettings.ReadWrite Contacts.ReadWrite"
还要注意,ContactFolders仅在有多个文件夹的情况下才返回结果。默认的“联系人”文件夹从不返回。如果用户没有其他文件夹,则将返回空结果。如果要分别获取主文件夹和附加文件夹,请合并结果。
// Get the defaultContacts
var defaultContacts = await graphClient
.Me
.Contacts
.Request()
.GetAsync();
// Get the contactFolders
var contactFolders = await graphClient
.Me
.ContactFolders
.Request()
.GetAsync();
// Use this to store the contact from all contact folder.
List<Contact> contactFolderContacts = new List<Contact>();
if (contactFolders.Count > 0) {
for (int i = 0; i < contactFolders.Count; i++) {
var folderContacts = await graphClient
.Me
.ContactFolders[contactFolders[i].Id]
.Contacts
.Request()
.GetAsync();
contactFolderContacts.AddRange(folderContacts.AsEnumerable());
}
// This will combine the contact from main folder and the additional folders.
contactFolderContacts.AddRange(defaultContacts.AsEnumerable());
} else {
// This user only has the default contacts folder
contactFolderContacts.AddRange(defaultContacts.AsEnumerable());
}
// Use this to test the result.
foreach (var item in contactFolderContacts) {
Debug.WriteLine("first:" + item.EmailAddresses);
}