использовать GraphServiceClient из нескольких потоков (параллельно) - отправлять письма - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно отправить несколько электронных писем с помощью Microsoft Graph из службы Windows.
Я использую Microsoft.Graph пакет NuGet.
Я создаю GraphServiceClient и отправляю почту так:

IGraphServiceClient graphClient = new GraphServiceClient("https://graph.microsoft.com/v1.0", authenticationProvider);
var email = new Message
{
    Body = new ItemBody
    {
        Content = "Works fine!",
        ContentType = BodyType.Html,
    },
    Subject = "Test",
    ToRecipients = recipientList
};

await graphClient.Users["test@example.onmicrosoft.com"].SendMail(email, true).Request().WithMaxRetry(5).PostAsync();

Когда я отправляю электронные письма по одному:

for (var j = 0; j < 20; j++)
{
    await graphClient.Users["test@example.onmicrosoft.com"].SendMail(email, true).Request().WithMaxRetry(5).PostAsync();
    progressBar1.PerformStep();
}

все работает нормально, но когда я использую Parallel.For:

var res = Parallel.For(0, 20, async (i, state) =>
{
    var email = new Message
    {
        Body = new ItemBody
        {
            Content = "Works fine!",
            ContentType = BodyType.Html,
        },
        Subject = "Test",
        ToRecipients = recipientList
    };

    await graphClient.Users["test@example.onmicrosoft.com"].SendMail(email, true).Request().WithMaxRetry(5).PostAsync();
});

Я получаю ошибки, потому что получаю слишком много запросов (429), а затем - неподдерживаемый тип носителя (415).

Это код ошибки:

Код: RequestBodyRead Сообщение: отсутствует или пустой заголовок типа контента был найден при попытке прочитать сообщение. Заголовок типа контента требуется.

Вот как это выглядит в Fiddler:

enter image description here

У меня вопрос: могу ли я использовать и как использовать Graph с Parallel.For, чтобы избежать ошибок такого рода. Я уже устанавливаю WithMaxRetry(5) для каждого запроса.

Я знаю об ограничениях использования, но я думал, что WithMaxRetry(5) поможет.

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Причина, по которой вы это увидели, заключается в отсутствии заголовка типа контента. Это не было клонировано, когда мы клонировали сообщение httprequest. Это было исправлено и будет в следующей версии клиента. Что касается параллельных потоков, мы планируем реализовать ресурсную очередь повторных попыток, чтобы мы использовали единую схему повторных попыток для нескольких запросов, направленных на один и тот же ресурс (и одну и ту же политику регулирования).

1 голос
/ 13 апреля 2019

Это не имеет отношения к темам. Это связано с throtteling a.k.a. Вы можете выполнить только x запросов в определенный период времени.

Клиент API dotnet graph не поддерживает пакетную обработку (как это ни печально). Но пакетирование сами эти запросы легко реализуются. Тогда вы можете отправить 15 писем с одним запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...