MicrosoftGraph API无法将消息标记为已读

NoO*_*One 2 .net email outlook microsoft-graph

我正在使用Microsoft.Graphnuget软件包(版本1.6.2),并且尝试将电子邮件标记为已读。这是代码:

        msg.IsRead = true;
        await MainPage.GraphServiceClient.Me.Messages[msg.Id].Request().Select("IsRead").UpdateAsync(msg);
Run Code Online (Sandbox Code Playgroud)

据我了解,以上代码仅应将该IsRead属性发送到服务器以进行更新。但是,执行此操作后,将发送整个消息对象(我已经使用Fiddler进行了验证),您将收到以下响应:

{
  "error": {
    "code": "ErrorInvalidPropertyUpdateSentMessage",
    "message": "Update operation is invalid for property of a sent message.",
    "innerError": {
      "request-id": "<A guid here that I wont share>",
      "date": "2017-07-29T21:10:18"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

代码正确吗,这是一个错误,我是否缺少某些内容或内容?有没有解决的办法?

H. *_*och 6

我自己也遇到了同样的问题,我刚刚遇到了您的问题。

我经过几次尝试后发现,尝试更新(PATCH)不允许更新的字段时会出现问题。

在您的情况下,在我的情况下,问题都在于,我们将msg对象的所有字段发送给了该对象,而不仅仅是修补和修改的字段。

代替执行以下操作:

 var msg = await MainPage.GraphServiceClient.Me.Messages[imapMessage.MessageId].Request().GetAsync();
 msg.IsRead = true;
 await MainPage.GraphServiceClient.Me.Messages[msg.Id].Request().Select("IsRead").UpdateAsync(msg);
Run Code Online (Sandbox Code Playgroud)

首先,您应该只获得IsRead属性,

从GraphAPI 1.9版本开始更新,我们只需要发送更新的属性,而不发送只读属性。

    await MainPage.GraphServiceClient.Me.Messages[msg.Id].Request().Select("IsRead").UpdateAsync(new Message {IsRead = true});
Run Code Online (Sandbox Code Playgroud)

希望它仍能以任何方式释放您。

  • 惊人的!刚刚尝试了一下,确实有效!谢谢。:) 我还没有想过这样做。 (2认同)
  • 请注意,在 1.9.0 版中,此代码可能会因为此错误而失败:https://github.com/microsoftgraph/msgraph-sdk-dotnet/issues/270。该链接中建议的解决方法也是对代码的改进,因为它减少了正在发送的请求的大小。 (2认同)