通过 Microsoft Graph 检索邮件比 EWS 慢
Retrieving Mail via Microsoft Graph is slower than 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。
因此,如果调用图表 api,将发生以下情况:
您的请求 -> 图 api -> 交换其余 api
唯一的变化是,通过使用图表 api,数据在服务器级别被格式化为 JSON。所以这可能是一个小 time/data 节省
我们想通过 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。
因此,如果调用图表 api,将发生以下情况: 您的请求 -> 图 api -> 交换其余 api
唯一的变化是,通过使用图表 api,数据在服务器级别被格式化为 JSON。所以这可能是一个小 time/data 节省