Я использую 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();
Получение ContactFolders
возвращает только папки, но не контакты в них. Вам необходимо сделать отдельный запрос к .Contacts
для каждой папки, чтобы получить фактические контакты.
У меня сейчас нет среды для тестирования на этом компьютере, но, насколько я понимаю, вы можете использовать параметр запроса опции для фильтрации контактов во вложенных папках.
вам нужно узнать все подпапки
GET / users / {id | userPrincipalName} / contactFolders
найти контакты в каждой подпапке
ПОЛУЧИТЬ / меня / contactFolder / {id} / childFolders / {id} / contacts
Для получения дополнительных папок контактов и контактной информации. Пожалуйста, прочтите эти документы. https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_list_contactfoldershttps://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_list_contacts
Прежде всего, этот пример кода создается в ядре .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);
}
Ваш код выглядит правильным, но я действительно не согласен с вашей причиной, по которой предлагаю эту область. Во-первых, я не уверен, куда они пойдут (какой «проект»?), Но, что более важно, область действия Только, необходимая для этого, - это Contacts.Read
(которая не включена в предлагаемые вами области).
@MarcLaFleur наверняка, что этот graphScope - это конфигурация основного проекта .net.
@MarcLaFleur Это чистый основной проект. Я использую Contacts.ReadWrite вместо Contacts.Read. Конечный пользователь может изменить GraphScope по своему желанию.
Я протестирую это и дам вам знать. Я решил проблему, выполнив вызов api для получения папок, а затем передав идентификатор папки для получения контактов с другим вызовом api. Я также опубликую свое решение, протестирую ваше и помечу как ответ, если это тоже сработало.
«Я решил проблему, выполнив вызов API для получения папок, а затем передав идентификатор папки для получения контактов с помощью другого вызова API». Ваша идея похожа на код, который я предоставил, но я добавляю дополнительный код для расширений.
@downvoter, почему голосование против? Если у вас есть конкретная проблема с вопросом, сообщите мне в комментариях, чтобы я мог соответствующим образом изменить вопрос