【发布时间】:2019-09-12 21:23:27
【问题描述】:
我们有一些代码已经成功运行了几个月,但昨天突然出现故障。
基本上,我们有一个进程通过 Graph API C# SDK (v1.12.0) 登录到邮箱,获取未读消息,遍历每条消息,进行一些处理,然后尝试将每条消息标记为“已读” .
以下是相关代码:
var graphserviceClient = new GraphServiceClient(_metaData.GraphBaseURL,
new DelegateAuthenticationProvider(
(requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
requestMessage.Headers.Add("Prefer", "outlook.body-content-type='text'");
return Task.FromResult(0);
}));
var unreadMails = graphserviceClient
.Users[_metaData.MailBox]
.MailFolders
.Inbox
.Messages
.Request()
.Filter("isRead eq false")
.Top(1000)
.Select("Body, Subject")
.GetAsync()
.Result;
emailRetrievalCount = unreadMails.Count();
// Determine if any results were returned
if (unreadMails.Count > 0)
{
// Create loop to process each item in the newResult object
foreach (var unreadMail in unreadMails)
{
// Set the isRead flag of the message to true
var readMail = graphserviceClient
.Me
.Messages[unreadMail.Id] //BREAKS HERE!!!
.Request()
.Select("IsRead")
.UpdateAsync(new Message { IsRead = true })
.Result;
}
}
异常消息:
Microsoft.Graph.ServiceException:代码:ErrorInternalServerError\r\n消息:发生内部服务器错误。操作失败。,无法打开邮箱。
我们检查了邮箱或帐户的权限,没有任何变化。此外,这似乎不是权限问题,因为我们可以获取令牌、登录并获取消息列表。只是当我们尝试获取特定消息来更新“读取”状态时,它失败了。另外,我们尝试将 SDK 更新到最新版本 v1.19.0,但出现了同样的问题。
【问题讨论】:
-
在您的代码中唯一突出的是当您调用
graphServiceClient同时将消息标记为已读时,您执行Me端点,而在检索它时您调用User[mailbox]。如果会话不同,则消息的 Id 将指向不同的邮箱,它将在那里失败。 -
真的不建议在异步方法上使用 .Result 。如果可能的话,你真的应该使用 await 。特别是如果您在 ASP.NET 站点中运行它。
标签: c# microsoft-graph-api microsoft-graph-sdks microsoft-graph-mail