Synchroniser des dossiers à l’aide d’EWS dans Exchange

Découvrez comment utiliser l’API managée EWS ou EWS pour obtenir une liste de dossiers, ou une liste de dossiers qui ont changé, afin de synchroniser votre client.

EWS dans Exchange utilise la synchronisation d’éléments et la synchronisation de dossiers pour synchroniser le contenu de la boîte aux lettres entre le client et le serveur. La synchronisation de dossiers obtient la liste initiale des dossiers à partir d’un dossier racine, puis, au fil du temps, obtient les modifications apportées à ces dossiers et obtient également de nouveaux dossiers.

Si vous effectuez la synchronisation de dossiers à l’aide de l’API managée EWS, vous obtenez d’abord la liste initiale des dossiers dans le dossier racine à l’aide de la méthode ExchangeService.SyncFolderHierarchy . Vous mettez ensuite à jour la valeur du paramètre cSyncState lors des appels suivants pour obtenir la liste des dossiers nouveaux et modifiés.

Pour effectuer la synchronisation de dossiers à l’aide d’EWS, vous demandez la liste initiale des dossiers dans le dossier racine à l’aide de l’opération SyncFolderHierarchy , analysez la réponse, puis, à un moment donné, obtenez les modifications apportées aux dossiers à la racine et analysez la réponse. Une fois que le client a reçu la liste des dossiers initiaux ou modifiés, il effectue des mises à jour localement. La façon dont et quand vous récupérez les modifications à l’avenir dépend du modèle de conception de synchronisation utilisé par votre application.

Obtenir la liste de tous les dossiers ou dossiers modifiés à l’aide de l’API managée EWS

L’exemple de code suivant montre comment obtenir une liste initiale de dossiers dans un dossier racine, puis obtenir la liste des modifications apportées aux dossiers dans le dossier racine qui se sont produites depuis la synchronisation précédente. Lors de l’appel initial à la méthode ExchangeService.SyncFolderHierarchy , définissez la valeur cSyncState sur null. Une fois la méthode terminée, enregistrez la valeur cSyncState localement à utiliser dans l’appel de méthode SyncFolderHierarchy suivant. Dans l’appel initial et les appels suivants, les dossiers sont récupérés par lots de dix, à l’aide d’appels successifs à la méthode SyncFolderHierarchy , jusqu’à ce qu’il ne reste plus de modifications. Cet exemple définit le paramètre propertySet sur IdOnly pour réduire les appels à la base de données Exchange, ce qui est une bonne pratique de synchronisation. Dans cet exemple, nous supposons que le service est une liaison d’objet ExchangeService valide et que cSyncState représente l’état de synchronisation retourné par un appel antérieur à SyncFolderHierarchy.

// Get a list of all folders in the mailbox by calling SyncFolderHierarchy.
// The folderId parameter must be set to the root folder to synchronize. 
// The propertySet parameter is set to IdOnly to reduce calls to the Exchange database
// because any additional properties result in additional calls to the Exchange database. 
// The syncState parameter is set to cSyncState, which should be null in the initial call, 
// and should be set to the sync state returned by the previous SyncFolderHierarchy call 
// in subsequent calls.
ChangeCollection<FolderChange> fcc = service.SyncFolderHierarchy(new FolderId(WellKnownFolderName.Root), PropertySet.IdOnly, cSyncState);
// If the count of changes is zero, there are no changes to synchronize.
if (fcc.Count == 0)
{
    Console.WriteLine("There are no folders to synchronize.");
}
// Otherwise, write all the changes included in the response 
// to the console. 
// For the initial synchronization, all the changes will be of type
// ChangeType.Create.
else
{
    foreach (FolderChange fc in fcc)
    {
        Console.WriteLine("ChangeType: " + fc.ChangeType.ToString());
        Console.WriteLine("FolderId: " + fc.FolderId);
        Console.WriteLine("===========");
    }
}
// Save the sync state for use in future SyncFolderItems requests.
// The sync state is used by the server to determine what changes to report
// to the client.
string fSyncState = fcc.SyncState;

Après avoir récupéré la liste des dossiers nouveaux ou modifiés sur le serveur, créez ou mettez à jour les dossiers sur le client.

Obtenir la liste initiale des dossiers à l’aide d’EWS

L’exemple suivant montre une requête XML pour obtenir la hiérarchie de dossiers initiale à l’aide de l’opération SyncFolderHierarchy . Il s’agit également de la requête XML que l’API managée EWS envoie lors de la récupération de la liste des dossiers initiaux à l’aide de la méthode SyncFolderHierarchy. L’élément SyncState de l’opération SyncFolderHierarchy n’est pas inclus, car il s’agit de la synchronisation initiale. Cet exemple définit l’élément BaseShape sur IdOnly pour réduire les appels à la base de données Exchange, ce qui est une bonne pratique de synchronisation.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                    xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                    xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
                    xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>
  <soap:Body>
    <m:SyncFolderHierarchy>
      <m:FolderShape>
        <t:BaseShape>IdOnly</t:BaseShape>
      </m:FolderShape>
      <m:SyncFolderId>
        <t:DistinguishedFolderId Id="root" />
      </m:SyncFolderId>
    </m:SyncFolderHierarchy>
  </soap:Body>
</soap:Envelope>

L’exemple suivant montre la réponse XML retournée par le serveur après avoir traité la demande d’opération SyncFolderHierarchy . La réponse initiale inclut des éléments Create pour tous les dossiers, car tous les dossiers sont considérés comme nouveaux lors d’une synchronisation initiale. Les valeurs de certains attributs et éléments ont été raccourcies pour plus de lisibilité, et certains blocs d’éléments Create ont été supprimés par souci de concision.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15"
                         MinorVersion="0"
                         MajorBuildNumber="785"
                         MinorBuildNumber="6"
                         Version="V2_6"
                         xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:SyncFolderHierarchyResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                                   xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:SyncFolderHierarchyResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:SyncState>H4sIAA==</m:SyncState>
          <m:IncludesLastFolderInRange>true</m:IncludesLastFolderInRange>
          <m:Changes>
            <t:Create>
              <t:Folder>
                <t:FolderId Id="AAMkADM="
                            ChangeKey="AQAAABYA"/>
              </t:Folder>
            </t:Create>
            <t:Create>
              <t:Folder>
                <t:FolderId Id="AAMkADMzM="
                            ChangeKey="AQAAABY"/>
              </t:Folder>
            </t:Create>
            <t:Create>
              <t:Folder>
                <t:FolderId Id="AAMkAD/AAA="
                            ChangeKey="AQAAABYA"/>
              </t:Folder>
            </t:Create>
            <t:Create>
              <t:Folder>
                <t:FolderId Id="AAMkADBh="
                            ChangeKey="AQAAABYA"/>
              </t:Folder>
            </t:Create>
            ...
          </m:Changes>
        </m:SyncFolderHierarchyResponseMessage>
      </m:ResponseMessages>
    </m:SyncFolderHierarchyResponse>
  </s:Body>
</s:Envelope>

Après avoir récupéré la liste des nouveaux dossiers sur le serveur, créez les dossiers sur le client.

Obtenir les modifications depuis la dernière synchronisation à l’aide d’EWS

L’exemple suivant montre la requête XML pour obtenir la liste des modifications apportées aux dossiers dans le dossier racine à l’aide de l’opération SyncFolderHierarchy . Il s’agit également de la requête XML que l’API managée EWS envoie lors de la récupération de la liste des modifications apportées au dossier racine. Cet exemple montre comment définir la valeur de l’élément SyncState sur la valeur retournée dans la réponse précédente. À des fins de démonstration, cet exemple définit l’élément BaseShape sur AllProperties au lieu de IdOnly pour afficher les propriétés supplémentaires retournées. La définition de l’élément BaseShape sur IdOnly est une bonne pratique de synchronisation. La valeur de SyncState a été raccourcie pour plus de lisibilité.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                    xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                    xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
                    xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>
  <soap:Body>
    <m:SyncFolderHierarchy>
      <m:FolderShape>
        <t:BaseShape>AllProperties</t:BaseShape>
      </m:FolderShape>
      <m:SyncFolderId>
        <t:DistinguishedFolderId Id="root" />
      </m:SyncFolderId>
      <m:SyncState>H4sIAA==</m:SyncState>
    </m:SyncFolderHierarchy>
  </soap:Body>
</soap:Envelope>

L’exemple suivant montre la réponse XML retournée par le serveur après qu’il a traité la demande d’opération SyncFolderHierarchy du client. Cette réponse indique qu’un dossier a été mis à jour, qu’un dossier a été créé et qu’un dossier a été supprimé depuis la synchronisation précédente. La valeur de l’élément SyncState , des attributs Id et des attributs ChangeKey a été raccourcie pour plus de lisibilité.

N’oubliez pas que la requête incluait l’élément BaseShape AllProperties. C’est juste à des fins de démonstration. Nous vous recommandons de définir l’élément BaseShape sur IdOnly en production.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="745" MinorBuildNumber="21" Version="V2_3" 
           xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types" 
           xmlns="https://schemas.microsoft.com/exchange/services/2006/types" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:SyncFolderHierarchyResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
            xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:SyncFolderHierarchyResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:SyncState>H4sIAAA</m:SyncState>
          <m:IncludesLastFolderInRange>true</m:IncludesLastFolderInRange>
          <m:Changes>
            <t:Update>
              <t:Folder>
                <t:FolderId Id="AAMkADM=" ChangeKey="AQAAABY" />
                <t:ParentFolderId Id="AQMkADMzADI1==" ChangeKey="AQAAAA==" />
                <t:FolderClass>IPF.Note</t:FolderClass>
                <t:DisplayName>Meeting Notes</t:DisplayName>
                <t:TotalCount>3</t:TotalCount>
                <t:ChildFolderCount>0</t:ChildFolderCount>
                <t:EffectiveRights>
                  <t:CreateAssociated>true</t:CreateAssociated>
                  <t:CreateContents>true</t:CreateContents>
                  <t:CreateHierarchy>true</t:CreateHierarchy>
                  <t:Delete>true</t:Delete>
                  <t:Modify>true</t:Modify>
                  <t:Read>true</t:Read>
                  <t:ViewPrivateItems>true</t:ViewPrivateItems>
                </t:EffectiveRights>
                <t:UnreadCount>0</t:UnreadCount>
              </t:Folder>
            </t:Update>
            <t:Create>
              <t:Folder>
                <t:FolderId Id="AAMkADMzM=" ChangeKey="AQAAABYAA" />
                <t:ParentFolderId Id="AQMkO67A==" ChangeKey="AQAAAA==" />
                <t:FolderClass>IPF.Note</t:FolderClass>
                <t:DisplayName>Schedules</t:DisplayName>
                <t:TotalCount>0</t:TotalCount>
                <t:ChildFolderCount>0</t:ChildFolderCount>
                <t:EffectiveRights>
                  <t:CreateAssociated>true</t:CreateAssociated>
                  <t:CreateContents>true</t:CreateContents>
                  <t:CreateHierarchy>true</t:CreateHierarchy>
                  <t:Delete>true</t:Delete>
                  <t:Modify>true</t:Modify>
                  <t:Read>true</t:Read>
                  <t:ViewPrivateItems>true</t:ViewPrivateItems>
                </t:EffectiveRights>
                <t:UnreadCount>0</t:UnreadCount>
              </t:Folder>
            </t:Create>
            <t:Delete>
              <t:FolderId Id="AAMkAD/AAA=" ChangeKey="AQAAAA==" />
            </t:Delete>
          </m:Changes>
        </m:SyncFolderHierarchyResponseMessage>
      </m:ResponseMessages>
    </m:SyncFolderHierarchyResponse>
  </s:Body>
</s:Envelope>

Mettre à jour le client

Si vous utilisez l’API managée EWS, après avoir obtenu la liste des dossiers nouveaux ou modifiés, utilisez la méthode Folder.Load pour obtenir les propriétés sur les éléments nouveaux ou modifiés, comparer les propriétés aux valeurs locales et mettre à jour ou créer les dossiers sur le client.

Si vous utilisez EWS, utilisez l’opération GetFolder pour obtenir des propriétés sur les dossiers nouveaux ou modifiés et mettre à jour ou créer les dossiers sur le client.

Voir aussi