2017-01-17 12 views
0

В настоящее время используется Outlook 2.0, что для меня действительно ново, и я столкнулся с непредвиденной проблемой. В настоящее время у меня есть моя аутентификация и я могу создать свой внешний Outlook без проблем. Однако, после проведения тестового запуска на почтовый ящик, который в настоящее время есть 250 писем я вижу, что этот апи только извлекает 10. Глядя, чтобы увидеть, если кто-то столкнулся с этим вопросом при использовании Outlook, апи v 2.0Перспектива звонка только возвращает 10 пунктов за звонок

Код

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; 
     } 
    } 

часы Результаты

enter image description here

ответ

1

OutlookREST API как имя указывает, является REST ар я. Вы используете SDK, который подделывает HTTP-запросы от вашего имени. Лично я создаю запросы вручную, даже если я работаю с C#. Даже при использовании SDK мой совет заключается в том, что вам нужно посмотреть на фактические запросы, сгенерированные и отправленные серверам, на которых расположен api. Я предлагаю вам использовать такой инструмент, как fiddler.

Сказав это, параметр по умолчанию для параметра ODATA $top установлен в 10. Вот почему у вас есть 10 элементов, но не беспокойтесь, вы можете их получить, вызвав следующую разбивку на страницы. Вы можете увидеть фактический URL-адрес продолжения в члене _continuation. Обратите внимание на значения $top и $skip параметров: это означает, что с этим запросом вы получаете еще 10 предметов, пропускающих 10 первых предметов.

Как правило, вы не сможете получить все предметы из неограниченного источника одним вызовом. Вам где-то нужен механизм разбивки на страницы. Однако вы можете увеличить размер страницы, изменив значение для параметра $top. Используя .NET SDK, от this page, похоже, вы должны использовать метод Take от LINQ.

+0

Благодарим вас за ответ Benoit. Я знаком с поисковым вызовом в JavaScript, который делается очень просто, потому что его лёгкие ограничения, но я могу обернуть свою голову вокруг, можете ли вы указать мне пример или статью? Еще раз, спасибо. – EasyE

+0

Я не совсем понимаю, что вам нужно, но эта документация по параметрам ODATA Outlook REST API https://msdn.microsoft.com/en-us/office/office365/api/complex-types-for-mail-contacts-calendar #OdataQueryParams поможет вам. –