Как я могу получить FileAttachment из сообщения вместо вложения - PullRequest
0 голосов
/ 14 января 2019

Прежде всего, спасибо, что нашли время, чтобы прочитать мой вопрос!

Мне нужно получить ContentByte вложения сообщения.

Я использую Microsoft.Graph SDK для dotnet . Я извлекаю сообщение, затем беру Message.Body.Content (это html) и показываю его в Iframe. Чтобы показать вложения (cid: ...), я должен получить их в Message.Attachments. Но есть моя проблема. Почтовые вложения имеют тип FileAttachment со свойством ContentByte, которое я могу использовать для отображения вложений. Проблема в том, что SDK не использует тип FileAttachment для Message.Attachments, но имеет тип Attachment, который не имеет свойства ContentByte.

Вот мой код:

Message data = await graphClient.Me
                .Messages[messageId]
                .Request().GetAsync();

и

var base64 = message.Attachments.Where(c => c.ContentId == contentId).ContentByte;

Когда я исследую «данные» с помощью отладчика, я вижу все поля из FileAttachment со всеми правильными данными. Но когда я пытаюсь получить доступ ко второй строке, я получаю красную строку под ContentId, потому что свойство не существует для вложения.

Является ли это ошибкой, ошибкой в ​​классе 'Message' или мне нужно указать где-то, что я хочу сохранить тип 'FileAttachment'?

Спасибо!

1 Ответ

0 голосов
/ 18 января 2019

Это ожидаемое поведение, поскольку Message.Attachments возвращает коллекцию Attachment типа .
Чтобы получить список вложений файлов, фильтр можно применить по FileAttachment типу через OfType метод Linq :

//request message with attachments
var message = await graphClient.Me
      .Messages[messageId]
      .Request().Expand("Attachments").GetAsync();
//filter by file attachments and return first one
var fileAttachment = message.Attachments.OfType<FileAttachment>()
      .FirstOrDefault(a => a.ContentId == contentId);

if (fileAttachment != null)
{
     var base64 = fileAttachment.ContentBytes;
     //...
}
...