Outlook 通话每次通话仅返回 10 个项目
Outlook call only returning 10 items per call
目前正在使用outlook v2.0,这对我来说真的很新,我遇到了一个无法预料的问题。目前我有我的身份验证并且能够毫无问题地创建我的 outlook 客户端。但是,在对当前有 250 封电子邮件的邮箱进行测试 运行 后,我发现此 api 仅检索 10 封。看看是否有人在使用 Outlook 时遇到此问题 运行 api v 2.0
代码
private static async Task<OutlookServicesClient> CreateOutlookClientAsync(AuthenticationContext authenticationContext)
{
OutlookServicesClient outlookClient = null;
try
{
outlookClient = new OutlookServicesClient(
new Uri(CrmPrototype.Helpers.AuthHelper.OutlookAPIEndpoint),
async () =>
await GetTokenHelperAsync(authenticationContext, CrmPrototype.Helpers.AuthHelper.OutlookAuthenticationEndpoint)
);
return outlookClient;
}
catch (Exception ex)
{
// TODO Log
return outlookClient;
}
}
private static async Task<GraphServiceClient> CreateGraphClientAsync(AuthenticationContext authenticationContext)
{
GraphServiceClient graphClient = null;
try
{
graphClient = new GraphServiceClient(
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
string accessToken = await GetTokenHelperAsync(authenticationContext, CrmPrototype.Helpers.AuthHelper.OutlookAuthenticationEndpoint);
// Append the access token to the request.
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
}));
return graphClient;
}
catch (Exception ex)
{
// TODO Log
return graphClient;
}
}
private static async Task<string> GetTokenHelperAsync(AuthenticationContext context, string resourceId)
{
string accessToken = null;
try
{
X509Certificate2 certificate = new X509Certificate2(CrmPrototype.Helpers.AuthHelper.devCertPath, CrmPrototype.Helpers.AuthHelper.devCertKey, X509KeyStorageFlags.MachineKeySet);
ClientAssertionCertificate clientAssertionCert = new ClientAssertionCertificate(CrmPrototype.Helpers.AuthHelper.devClientId, certificate);
AuthenticationResult result = null;
result = await context.AcquireTokenAsync(resourceId, clientAssertionCert);
accessToken = result.AccessToken;
return accessToken;
}
catch (Exception ex)
{
// TODO Log
return accessToken;
}
}
public static async Task<IMessageCollection> GetEmails(string emailBox)
{
IMessageCollection emails = null;
AuthenticationContext authenticationContext = new AuthenticationContext(CrmPrototype.Helpers.AuthHelper.devTenant);
try
{
var outlookClient = await CreateOutlookClientAsync(authenticationContext);
var mail_Box = await outlookClient.Users[emailBox].MailFolders["Inbox"].Messages.OrderByDescending(m => m.ReceivedDateTime).ExecuteAsync();
var messages = mail_Box.CurrentPage; << only gets 10 emails at a time
foreach (var message in messages)
{
var stop = 0;
}
return emails;
}
catch (Exception ex)
{
// TODO Log
return emails;
}
}
观看结果
OutlookRESTAPI顾名思义就是RESTapi。您正在使用代表您伪造 http 网络请求的 SDK。就个人而言,即使我使用 C#,我也会手动伪造请求。即使在使用 SDK 时,我的建议是您需要查看生成并发送到托管 api 的服务器的实际请求。我建议你使用像 fiddler.
这样的工具
话虽如此,$top
ODATA 参数的默认参数设置为 10。这就是为什么您有 10 个项目,但不用担心,您可以通过调用下一个分页来获取所有项目。您可以在 _continuation
成员中看到实际的延续 url。请注意值 $top
和 $skip
参数:这意味着通过此请求您将跳过前 10 个项目再获取 10 个项目。
通常,您无法通过一次调用从无限源中获取所有项目。您在某处需要一个分页机制。但是,您可以通过更改 $top
参数的值来增加页面大小。使用 .NET SDK,从 this page 看来您应该使用 LINQ 的 Take
方法。
目前正在使用outlook v2.0,这对我来说真的很新,我遇到了一个无法预料的问题。目前我有我的身份验证并且能够毫无问题地创建我的 outlook 客户端。但是,在对当前有 250 封电子邮件的邮箱进行测试 运行 后,我发现此 api 仅检索 10 封。看看是否有人在使用 Outlook 时遇到此问题 运行 api v 2.0
代码
private static async Task<OutlookServicesClient> CreateOutlookClientAsync(AuthenticationContext authenticationContext)
{
OutlookServicesClient outlookClient = null;
try
{
outlookClient = new OutlookServicesClient(
new Uri(CrmPrototype.Helpers.AuthHelper.OutlookAPIEndpoint),
async () =>
await GetTokenHelperAsync(authenticationContext, CrmPrototype.Helpers.AuthHelper.OutlookAuthenticationEndpoint)
);
return outlookClient;
}
catch (Exception ex)
{
// TODO Log
return outlookClient;
}
}
private static async Task<GraphServiceClient> CreateGraphClientAsync(AuthenticationContext authenticationContext)
{
GraphServiceClient graphClient = null;
try
{
graphClient = new GraphServiceClient(
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
string accessToken = await GetTokenHelperAsync(authenticationContext, CrmPrototype.Helpers.AuthHelper.OutlookAuthenticationEndpoint);
// Append the access token to the request.
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
}));
return graphClient;
}
catch (Exception ex)
{
// TODO Log
return graphClient;
}
}
private static async Task<string> GetTokenHelperAsync(AuthenticationContext context, string resourceId)
{
string accessToken = null;
try
{
X509Certificate2 certificate = new X509Certificate2(CrmPrototype.Helpers.AuthHelper.devCertPath, CrmPrototype.Helpers.AuthHelper.devCertKey, X509KeyStorageFlags.MachineKeySet);
ClientAssertionCertificate clientAssertionCert = new ClientAssertionCertificate(CrmPrototype.Helpers.AuthHelper.devClientId, certificate);
AuthenticationResult result = null;
result = await context.AcquireTokenAsync(resourceId, clientAssertionCert);
accessToken = result.AccessToken;
return accessToken;
}
catch (Exception ex)
{
// TODO Log
return accessToken;
}
}
public static async Task<IMessageCollection> GetEmails(string emailBox)
{
IMessageCollection emails = null;
AuthenticationContext authenticationContext = new AuthenticationContext(CrmPrototype.Helpers.AuthHelper.devTenant);
try
{
var outlookClient = await CreateOutlookClientAsync(authenticationContext);
var mail_Box = await outlookClient.Users[emailBox].MailFolders["Inbox"].Messages.OrderByDescending(m => m.ReceivedDateTime).ExecuteAsync();
var messages = mail_Box.CurrentPage; << only gets 10 emails at a time
foreach (var message in messages)
{
var stop = 0;
}
return emails;
}
catch (Exception ex)
{
// TODO Log
return emails;
}
}
观看结果
OutlookRESTAPI顾名思义就是RESTapi。您正在使用代表您伪造 http 网络请求的 SDK。就个人而言,即使我使用 C#,我也会手动伪造请求。即使在使用 SDK 时,我的建议是您需要查看生成并发送到托管 api 的服务器的实际请求。我建议你使用像 fiddler.
这样的工具话虽如此,$top
ODATA 参数的默认参数设置为 10。这就是为什么您有 10 个项目,但不用担心,您可以通过调用下一个分页来获取所有项目。您可以在 _continuation
成员中看到实际的延续 url。请注意值 $top
和 $skip
参数:这意味着通过此请求您将跳过前 10 个项目再获取 10 个项目。
通常,您无法通过一次调用从无限源中获取所有项目。您在某处需要一个分页机制。但是,您可以通过更改 $top
参数的值来增加页面大小。使用 .NET SDK,从 this page 看来您应该使用 LINQ 的 Take
方法。