通过 Microsoft Graph 检索邮件比 EWS 慢

问题描述

我们希望从 C# 应用程序的 Office365 收件箱中检索电子邮件。 我们曾经使用 EWS,但想更改为 Graph。但是,如果我们通过 Graph 检索电子邮件,则需要两倍于使用 EWS 的时间(~400ms vs ~200ms)。

这是 EWS 代码

ExchangeService service = <...>;
PropertySet properties = new PropertySet(BasePropertySet.IdOnly,EmailMessageSchema.From,EmailMessageSchema.DateTimeSent,EmailMessageSchema.Subject,EmailMessageSchema.CcRecipients,EmailMessageSchema.BccRecipients,EmailMessageSchema.Importance,EmailMessageSchema.ToRecipients,EmailMessageSchema.Attachments,EmailMessageSchema.Size,EmailMessageSchema.Sender,EmailMessageSchema.Body,EmailSchema.MailComment,EmailSchema.MailImportance,EmailSchema.MailMessageClass,EmailMessageSchema.DateTimeReceived,EmailSchema.MailTransportHeader);
properties.RequestedBodyType = Microsoft.Exchange.WebServices.Data.BodyType.HTML;
EmailMessage mail = EmailMessage.Bind(service,"<mailid>",properties);

这是图形代码

GraphServiceClient client = <...>;
Message msg = client
               .Users["<user>"]
               .Messages["<mailid>"]
               .Request()
.Select("id,parentFolderId,isRead,from,sentDateTime,subject,ccRecipients,bccRecipients,attachments,importance,toRecipients,sender,body,receivedDateTime")
            .Expand("microsoft.graph.message/attachments," +
                "singleValueExtendedProperties($filter=Id eq 'Long 0xe08'" +
                " or Id eq 'String 0x1a'" +
                " or Id eq 'String 0x7d'" +
                " or Id eq 'Integer 0x17'" +
                " or Id eq 'String 0x3004')")
            .GetAsync()
            .Result;

为什么 Graph 比较慢?我们应该改变什么才能使 Graph 像 EWS 一样高性能

解决方法

我们发现只有第一次通过 Graph 访问邮件服务器需要更长的时间。每个后续请求的性能至少与通过 EWS 一样。所以这个问题已经为我们解决了。谢谢@Danstan 的评论。

,

我的猜测是图形 api 永远不会比 EWS api 快。

图形 api 是“只是”(不是正确的词)一个非常花哨且速度极快的 api 代理,将所有可用资源组合到一个 api 中。

所以如果调用graph api,会发生以下情况: 您的请求 -> 图 api -> 交换休息 api

唯一的变化是通过使用图形 API,数据在服务器级别被格式化为 JSON。所以这可能是一个小的时间/数据节省

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...