Невозможно прочитать вложения из электронной почты с помощью Outlook Graph API версии 2 на C#

Я пытаюсь прочитать вложение электронной почты с помощью API Microsoft Graph (v2), но получаю сообщение об ошибке «Ссылка на объект не указывает на экземпляр»

Я проверил разрешения приложения в Azure Active Directory и получил все разрешения, указанные в документации Microsoft.

Mail.Read Group.Read.All (добавлено дополнительное разрешение для попытки) Я могу правильно прочитать сообщение и его содержимое, и даже свойство сообщения «HasAttachments» истинно, но когда я снова вызываю API для извлечения вложений, это дает ошибку.

Также попытался создать новый токен для извлечения вложений, учитывая тот факт, что срок действия существующего истек, но безуспешно.

OutlookServicesClient client = new OutlookServicesClient(new Uri(OutlookAPI), GetAccessToken);

client.Context.SendingRequest2 +=
                    new EventHandler<Microsoft.OData.Client.SendingRequest2EventArgs>((sender, e) => InsertXAnchorMailboxHeader(sender, e, userEmail));
 var attachments = await client.Me.MailFolders.GetById(constInbox).Messages.GetById(strMessageID).Attachments.ExecuteAsync();


public async Task<string> GetAccessToken()
        {
       string accessToken = null;
           using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(TokenUri);
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
                var requestContent = string.Format("grant_type=password" + "&client_id=" + appId +
                                                    "&client_secret=" + appPassword +
                                                    "&resource=" + Resource +
                                                    "&username=" + userEmail +
                                                   "&password=" + passwd);
                var content = new StringContent(requestContent, Encoding.UTF8, "application/x-www-form-urlencoded");
                var response = client.PostAsync(client.BaseAddress, content).Result;
                var result = response.Content.ReadAsStringAsync().Result;
                var jobject = JsonConvert.DeserializeObject<JObject>(result);
                accessToken = jobject.GetValue("access_token").ToString();
            }
            return accessToken;
        }

Прикрепление Quickwatch для клиента. Пожалуйста, проверьте клиент во время выполнения


person Dipti K    schedule 09.09.2019    source источник
comment
Ошибка говорит о том, что какой-то объект не установлен. Вы правильно инициализировали client1? Пожалуйста, покажите немного больше вашего кода.   -  person LocEngineer    schedule 09.09.2019
comment
Ниже приведен код, который я использую для инициализации клиента: OutlookServicesClient client1 = new OutlookServicesClient(new Uri(OutlookAPI), GetAccessToken); client.Context.SendingRequest2 += new EventHandler‹Microsoft.OData.Client.SendingRequest2EventArgs›((sender, e) =› InsertXAnchorMailboxHeader(sender, e, userEmail));   -  person Dipti K    schedule 10.09.2019
comment
GetAccessToken() имеет следующую логику: client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(Bearer, accessToken); var requestContent = string.Format(grant_type=password + &client_id= + appId + &client_secret= + appPassword + &resource= + Resource + &username= + userEmail + &password= + passwd);   -  person Dipti K    schedule 10.09.2019
comment
Нужно ли устанавливать какие-то особые настройки для чтения вложений?   -  person Dipti K    schedule 10.09.2019
comment
Пожалуйста, отредактируйте свое сообщение, чтобы включить дополнительный код. Читать код в комментарии довольно сложно, и ему не хватает контекста, если он не показан по отношению к остальной части кода. Вы проверили, получаете ли вы правильный токен доступа? Вы установили точки останова и проверили правильность инициализации клиента?   -  person LocEngineer    schedule 10.09.2019
comment
Пожалуйста, проверьте отредактированный пост. Я правильно получаю токен доступа. Есть ли что-то конкретное, что я должен проверить в клиенте?   -  person Dipti K    schedule 10.09.2019
comment
О да. Вы инициализируете client после вызова await client. ‹= Вот загвоздка! Перенесите первую строку на третью.   -  person LocEngineer    schedule 10.09.2019
comment
Пожалуйста, проверьте, могу ли я правильно инициализировать клиент, а также я могу правильно читать почту. Дайте мне знать, если вам нужно какое-то конкретное значение.   -  person Dipti K    schedule 10.09.2019
comment
Не имеет опыта работы с Graph API, но, согласно документации, ваш вызов .Attachments.ExecuteAsync() должен быть скорее .Attachments.Request().GetAsync();. docs.microsoft.com /en-us/graph/api/   -  person LocEngineer    schedule 10.09.2019
comment
Да, но это дает ошибку, когда мы пишем .Attachments.Request().GetAsync();.... Ошибка CS1061 'IAttachmentCollection' не содержит определения для 'Request' и нет доступного метода расширения 'Request'   -  person Dipti K    schedule 10.09.2019
comment
Ты все еще делаешь что-то не так. Он должен работать согласно документации: docs.microsoft.com/en-us/graph/api/ Обновите свой код, чтобы он отражал ваш текущий статус.   -  person LocEngineer    schedule 10.09.2019
comment
Я столкнулся с таким же поведением, работая с файлом GraphServiceClient. Мне нужно было выполнить еще один запрос, чтобы получить вложения после первого запроса, получившего сообщения. Этот вопрос В частности, ответ Томаша Пола помог мне и может быть тем, что вам нужно для OutlookServicesClient   -  person Brandon McClure    schedule 03.04.2020