Synchronisieren von Ordnern unter Verwendung von EWS in Exchange

Erfahren Sie, wie Sie die verwaltete EWS-API oder EWS verwenden, um eine Liste von Ordnern oder eine Liste geänderter Ordner abzurufen, um Ihren Client zu synchronisieren.

EWS in Exchange verwendet Elementsynchronisierung und Ordnersynchronisierung, um Postfachinhalte zwischen Client und Server zu synchronisieren. Die Ordnersynchronisierung ruft die anfängliche Liste der Ordner aus einem Stammordner ab und ruft dann im Laufe der Zeit Änderungen ab, die an diesen Ordnern vorgenommen wurden, und ruft auch neue Ordner ab.

Wenn Sie die Ordnersynchronisierung mithilfe der verwalteten EWS-API durchführen, rufen Sie zunächst die anfängliche Liste der Ordner im Stammordner mithilfe der ExchangeService.SyncFolderHierarchy-Methode ab. Anschließend aktualisieren Sie den Wert des cSyncState-Parameters bei nachfolgenden Aufrufen, um die Liste der neuen und geänderten Ordner abzurufen.

Um die Ordnersynchronisierung mithilfe von EWS durchzuführen, fordern Sie die anfängliche Liste der Ordner im Stammordner an, indem Sie den SyncFolderHierarchy-Vorgang verwenden, die Antwort analysieren und dann zu einem späteren Zeitpunkt die Änderungen an den Ordnern im Stamm abrufen und die Antwort analysieren. Nachdem der Client die Liste der ursprünglichen oder geänderten Ordner empfangen hat, nimmt er lokal Updates vor. Wie und wann Sie Änderungen in Zukunft abrufen, hängt vom Synchronisierungsentwurfsmuster ab, das Ihre Anwendung verwendet.

Abrufen der Liste aller Ordner oder geänderten Ordner mithilfe der verwalteten EWS-API

Das folgende Codebeispiel zeigt, wie Sie eine anfängliche Liste von Ordnern in einem Stammordner und dann eine Liste der Änderungen an Ordnern im Stammordner abrufen, die seit der vorherigen Synchronisierung aufgetreten sind. Legen Sie während des ersten Aufrufs der ExchangeService.SyncFolderHierarchy-Methode den Wert cSyncState auf NULL fest. Wenn die Methode abgeschlossen ist, speichern Sie den cSyncState-Wert lokal, um ihn im nächsten Aufruf der SyncFolderHierarchy-Methode zu verwenden. Sowohl beim ersten Aufruf als auch bei den nachfolgenden Aufrufen werden die Ordner in Batches von zehn abgerufen, indem aufeinanderfolgende Aufrufe der SyncFolderHierarchy-Methode verwendet werden, bis keine weiteren Änderungen mehr vorhanden sind. In diesem Beispiel wird der propertySet-Parameter auf IdOnly festgelegt, um Aufrufe der Exchange-Datenbank zu reduzieren. Dies ist eine bewährte Synchronisierungsmethode. In diesem Beispiel wird davon ausgegangen, dass service eine gültige ExchangeService-Objektbindung ist und dass cSyncState den Synchronisierungsstatus darstellt, der von einem vorherigen Aufruf von SyncFolderHierarchy zurückgegeben wurde.

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

Nachdem Sie die Liste der neuen oder geänderten Ordner auf dem Server abgerufen haben, erstellen oder aktualisieren Sie die Ordner auf dem Client.

Abrufen der anfänglichen Liste von Ordnern mithilfe von EWS

Das folgende Beispiel zeigt eine XML-Anforderung zum Abrufen der anfänglichen Ordnerhierarchie mithilfe des SyncFolderHierarchy-Vorgangs . Dies ist auch die XML-Anforderung, die die verwaltete EWS-API sendet, wenn die Liste der anfänglichen Ordner mithilfe der SyncFolderHierarchy-Methode abgerufen wird. Das SyncState-Element des SyncFolderHierarchy-Vorgangs ist nicht enthalten, da dies die erste Synchronisierung ist. In diesem Beispiel wird das BaseShape-Element auf IdOnly festgelegt, um Aufrufe der Exchange-Datenbank zu reduzieren. Dies ist eine bewährte Synchronisierungsmethode.

<?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>

Das folgende Beispiel zeigt die XML-Antwort, die vom Server zurückgegeben wird, nachdem er die SyncFolderHierarchy-Vorgangsanforderung verarbeitet hat. Die erste Antwort enthält Create-Elemente für alle Ordner, da alle Ordner während einer ersten Synchronisierung als neu betrachtet werden. Die Werte einiger Attribute und Elemente wurden aus Gründen der Lesbarkeit gekürzt, und einige Create-Elementblöcke wurden aus Platzgründen entfernt.

<?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>

Nachdem Sie die Liste der neuen Ordner auf dem Server abgerufen haben, erstellen Sie die Ordner auf dem Client.

Abrufen der Änderungen seit der letzten Synchronisierung mithilfe von EWS

Das folgende Beispiel zeigt die XML-Anforderung zum Abrufen der Liste der Änderungen an Ordnern im Stammordner mithilfe des SyncFolderHierarchy-Vorgangs . Dies ist auch die XML-Anforderung, die die verwaltete EWS-API sendet, wenn die Liste der Änderungen an den Stammordner abgerufen wird. In diesem Beispiel wird der Wert des SyncState-Elements auf den Wert festgelegt, der in der vorherigen Antwort zurückgegeben wurde. Zu Demonstrationszwecken legt dieses Beispiel das BaseShape-Element auf AllProperties anstelle von IdOnly fest, um die zusätzlichen zurückgegebenen Eigenschaften anzuzeigen. Das Festlegen des BaseShape-Elements auf IdOnly ist eine bewährte Methode für die Synchronisierung. Der Wert von SyncState wurde aus Gründen der Lesbarkeit gekürzt.

<?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>

Das folgende Beispiel zeigt die XML-Antwort, die vom Server zurückgegeben wird, nachdem er die SyncFolderHierarchy-Vorgangsanforderung vom Client verarbeitet hat. Diese Antwort gibt an, dass ein Ordner aktualisiert, ein Ordner erstellt und ein Ordner seit der vorherigen Synchronisierung gelöscht wurde. Der Wert des SyncState-Elements , der Id-Attribute und der ChangeKey-Attribute wurden aus Gründen der Lesbarkeit gekürzt.

Denken Sie daran, dass die Anforderung die AllProperties-Basisform enthielt. Dies dient nur zu Demonstrationszwecken. Es wird empfohlen, das BaseShape-Element in der Produktion auf IdOnly festzulegen.

<?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>

Aktualisieren des Clients

Wenn Sie die verwaltete EWS-API verwenden, verwenden Sie nach dem Abrufen der Liste der neuen oder geänderten Ordner die Folder.Load-Methode , um Eigenschaften für die neuen oder geänderten Elemente abzurufen, die Eigenschaften mit den lokalen Werten zu vergleichen und die Ordner auf dem Client zu aktualisieren oder zu erstellen.

Wenn Sie EWS verwenden, verwenden Sie den GetFolder-Vorgang , um Eigenschaften für die neuen oder geänderten Ordner abzurufen und die Ordner auf dem Client zu aktualisieren oder zu erstellen.

Siehe auch