0

我需要使用 Windows 服务中的 Microsoft Graph 发送多封电子邮件。
我正在使用Microsoft.GraphNuGet 包。
我正在创建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 中的外观:

在此处输入图像描述

我的问题是:我可以使用以及应该如何使用 GraphParallel.For来避免这种错误。我已经WithMaxRetry(5)为每个请求进行了设置。

我知道使用限制,但我认为WithMaxRetry(5)会有所帮助。

4

2 回答 2

1

它与线程无关。它与节流有关,也就是您只能在特定时间段内执行 x 次请求。

dotnet graph api 客户端不支持批处理(很遗憾)。但是自己批量处理这些请求很容易实现。然后您可以通过一个请求发送 15 封邮件。

于 2019-04-13T20:58:34.200 回答
1

您看到此内容的原因是缺少内容类型标头。当我们克隆 httprequestmessage 时,它​​并没有被克隆。这已修复,将在客户端的下一个版本中。关于并行线程,我们计划实现基于资源的共享重试队列,以便我们在针对相同资源(和相同限制策略)的多个请求中使用单一重试方案。

于 2019-04-19T02:32:46.297 回答