【问题标题】:Microsoft Graph API - cannot access individual message (exception)Microsoft Graph API - 无法访问单个消息(例外)
【发布时间】: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


【解决方案1】:

我能够确认服务行为发生了变化,现在阻止了从其他邮箱访问电子邮件。这是不正确的行为,已得到修复。通过将您的呼叫更改为访问.Users[_metaData.MailBox].Messages[unreadMail.Id],应该可以解决问题。

【讨论】:

  • 谢谢,我们在代码中进行了此更改并修复了我们的一些邮箱访问权限,但是,其他几个邮箱需要在 O365 中完全重建才能正常工作。
  • 您解决了所有邮箱的问题吗?有些邮箱也有同样的问题,其他的没有,很奇怪!
猜你喜欢
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2019-08-28
  • 2018-06-07
相关资源
最近更新 更多