问题描述
我们希望从 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。所以这可能是一个小的时间/数据节省