Невозможно отправить большое вложение с помощью Graph API - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь добавить большое вложение в электронное письмо с помощью Microsoft Graph.

Шаги:

Получить токен:

public static async Task<GraphServiceClient> GetAuthenticatedClientForApp(IConfidentialClientApplication app)
{
    GraphServiceClient graphClient = null;
    // Create Microsoft Graph client.
    try
    {
        var token = await GetTokenForAppAsync(app);
        graphClient = new GraphServiceClient(
            "https://graph.microsoft.com/beta",
            new DelegateAuthenticationProvider(async(requestMessage) =>
            {
                requestMessage.Headers.Authorization =
                    new AuthenticationHeaderValue("bearer", token);

            }));
        return graphClient;
    }

    catch (Exception ex)
    {
        Logger.Error("Could not create a graph client: " + ex.Message);
    }

    return graphClient;
}
/// <summary>
/// Get Token for App.
/// </summary>
/// <returns>Token for app.</returns>
public static async Task<string> GetTokenForAppAsync(IConfidentialClientApplication app)
{
    AuthenticationResult authResult;
    authResult = await app
        .AcquireTokenForClient(new string[] { "https://graph.microsoft.com/.default" })
        .ExecuteAsync(System.Threading.CancellationToken.None);
    return authResult.AccessToken;
}

Создать черновик:

Message draft = await client
    .Users[emailDTO.FromEmail]
    .Messages
    .Request()
    .AddAsync(msg);

Прикрепить файл:

if (emailDTO.FileAttachments != null && emailDTO.FileAttachments.Count() > 0)
{
    foreach (EmailAttachment emailAttachment in emailDTO.FileAttachments)
    {
        if (emailAttachment.UploadFile != null && emailAttachment.UploadFile.Length > 0)
        {
            var attachmentItem = new AttachmentItem
            {
                AttachmentType = AttachmentType.File,
                Name = emailAttachment.FileName,
                Size = emailAttachment.UploadFile.Length
            };
            var session = await client
                .Users[emailDTO.FromEmail]
                .MailFolders
                .Drafts
                .Messages[draft.Id]
                .Attachments
                .CreateUploadSession(attachmentItem)
                .Request()
                .PostAsync();

            var stream = new MemoryStream(emailAttachment.UploadFile);
            var maxChunkSize = 320 * 1024 * 1024;
            var provider = new ChunkedUploadProvider(session, client, stream, maxChunkSize);
            var readBuffer = new byte[maxChunkSize];
            var chunkRequests = provider.GetUploadChunkRequests();

            //var uploadedItem = await provider.UploadAsync();
            var trackedExceptions = new List<Exception>();
            foreach (var rq in chunkRequests)
            {
                var result = await provider.GetChunkRequestResponseAsync(rq, readBuffer, trackedExceptions);
            }
        }
    }
}

Ошибка:

{
  Code: InvalidAudienceForResource
  Message: The audience claim value is invalid for current resource. 
            Audience claim is 'https://graph.microsoft.com', request url is
            'https://outlook.office.com/api/beta/User

1 Ответ

1 голос
/ 08 февраля 2020

Я считаю, что проблема здесь в том, что созданный URL-адрес сеанса указывает на ресурс, которого нет в Microsoft Graph. Однако, когда вы используете тот же клиент для вызова этой конечной точки, он передает маркер-носитель, который принадлежит Graph. Я считаю, что URL-адрес сеанса имеет токен доступа в URL, который является достаточным.

Вы можете обновить функцию DelegateAuthenticationProvider, добавив заголовок авторизации только для хостов, которые являются graph.microsoft.com. Или вы можете использовать наш LargeFileUploadTask вместо ChunkedUploadProvider, и он сделает большую часть этой работы за вас. К сожалению, я еще не закончил документы для этого. Я скоро вернусь и обновлю этот пост со ссылкой на документацию.

...