Synchronisierung von Postfächern und EWS in Exchange
Erfahren Sie, wie die Postfachsynchronisierung funktioniert, wenn Sie EWS zum Zugreifen auf Exchange verwenden.
EWS in Exchange verwendet zwei Synchronisierungsarten zum Abrufen von Postfachinhalten und Änderungen an Postfachinhalten:
- Synchronisierung von Ordnern
- Synchronisierung von Elementen
In diesem Artikel erfahren Sie mehr über die beiden Synchronisierungsarten, die Funktionsweise der Synchronisierung, Entwurfsmuster für die Synchronisierung sowie bewährte Methoden für die Synchronisierung.
Synchronisierung von Ordnern und Elementen
Bei der Ordnersynchronisierung wird eine Ordnerstruktur oder Ordnerhierarchie synchronisiert. Bei der Elementsynchronisierung werden die Elemente in einem Ordner synchronisiert. Wenn Sie Elemente synchronisieren, müssen Sie jeden Ordner im Postfach separat synchronisieren. Sie können EWS oder die verwaltete EWS-API in Ihrer Anwendung verwenden, um sowohl die Ordner- als auch die Elementsynchronisierung zu implementieren.
Tabelle 1: EWS-Vorgänge und von EWS verwaltete API-Methoden zum Synchronisieren von Ordnern und Elementen
EWS-Vorgang | Von EWS verwaltete API-Methode |
---|---|
SyncFolderHierarchy | ExchangeService.SyncFolderHierarchy-Methode |
SyncFolderItems | ExchangeService.SyncFolderItems-Methode |
Der Umfang der ausgeführten Synchronisierung variiert in Abhängigkeit davon, ob es sich um eine erste oder eine fortlaufende Synchronisierung handelt:
- Bei einer ersten Synchronisierung werden alle Ordner oder Elemente auf dem Server auf den Client synchronisiert. Nach der ersten Synchronisierung weist der Client einen Synchronisierungsstatus auf, der für zukünftige Synchronisierungen gespeichert wird. Der Synchronisierungsstatus stellt alle Änderungen auf dem Server dar, die der Server an den Client kommuniziert hat.
- Bei fortlaufenden Synchronisierungen werden alle Elemente oder Ordner synchronisiert, die hinzugefügt, gelöscht oder seit der vorherigen Synchronisierung geändert wurden. Der Server verwendet den Synchronisierungsstatus, um die Änderungen zu berechnen, die während der laufenden Synchronisierungsschleifen an den Client gemeldet werden.
Jede Synchronisierungsmethode oder jeder Vorgang gibt eine Liste von Änderungen zurück, und nicht den eigentlichen Ordner oder die Nachricht, der bzw. die geändert wurde. Änderungen an Elementen und Ordnern werden anhand der folgenden Änderungstypen gemeldet:
- Erstellen – Gibt an, dass ein neues Element oder ein neuer Ordner auf dem Client erstellt werden soll.
- Aktualisieren – Gibt an, dass ein neues Element oder ein neuer Ordner auf dem Client geändert werden soll.
- Löschen – Gibt an, dass ein Element oder ein Ordner auf dem Client gelöscht werden soll.
- ReadStateChange für EWS oder ReadFlagChange für die verwaltete EWS-API – Gibt an, dass der Lesestatus des Elements geändert wurde, entweder von ungelesen zu gelesen oder von gelesen zu ungelesen.
In Exchange Online, Exchange Online als Teil von Office 365 und Versionen von Exchange ab Exchange 2010 SP2 werden Elemente und Ordner in der Reihenfolge vom neuesten zum ältesten Element/Ordner zurückgegeben. In früheren Versionen von Exchange werden Elemente und Ordner in der Reihenfolge vom ältesten zum neuesten Element/Ordner zurückgegeben.
Wie funktioniert die EWS-Synchronisierung?
Kurz zusammengefasst: Wenn Sie ein Postfach zum ersten Mal synchronisieren, verwenden Sie den Vorgang, wie in Abbildung 1 dargestellt. Sie können zwar andere Synchronisierungsentwurfsmuster verwenden, dieser Ansatz wird jedoch für skalierbare Anwendungen empfohlen.
Abbildung 1. Entwurfsmuster für erste Synchronisierung
Wenn Sie einen vorhandenen Synchronisierungsstatus auf dem Client verwenden, um ein Postfach zu synchronisieren, wird empfohlen, dass Sie das in Abbildung 2 dargestellte Entwurfsmuster implementieren.
Abbildung 2. Entwurfsmuster für fortlaufende Synchronisierung
Synchronisierungsentwurfsmuster
Sie können eines der beiden Synchronisierungsentwurfsmuster in Ihrer Anwendung verwenden, um Ihre Postfächer auf dem neuesten Stand zu halten: benachrichtigungsbasierte Synchronisierung oder der Ansatz, bei dem nur eine Synchronisierung ausgeführt wird.
Die benachrichtigungsbasierte Synchronisation, wie in Abbildung 2 dargestellt, basiert auf Benachrichtigungen, um den Client darauf aufmerksam zu machen, dass er die Methoden SyncFolderItems oder SyncFolderHierarchy der verwalteten EWS-API oder die Vorgänge SyncFolderHierarchy oder SyncFolderItems von EWS aufrufen soll. Diese Art von Synchronisierung wird im Allgemeinen für skalierbare Anwendungen empfohlen, ist aber möglicherweise nicht für alle Benutzer optimal geeignet. Die benachrichtigungsbasierte Synchronisierung weist die folgenden Vorteile auf:
Benachrichtigungen sind so optimiert, dass die Anzahl von Aufrufen der Back-End-Exchange-Datenbank reduziert wird. Ereigniswarteschlangen und Abonnements werden vom Postfachserver (bzw. vom Clientzugriffsserver in Exchange 2010 und Exchange 2007) verwaltet. Die Verwaltung der Ereignisse und Abonnements verwendet jedoch weniger Ressourcen als die Alternative, die in häufigeren Synchronisierungsaufrufen der Exchange-Datenbank besteht. Exchange verfügt darüber hinaus über bestimmte Einschränkungsrichtlinien für Benachrichtigungen und Abonnements, um den Verbrauch von Ressourcen zu schützen.
Es gibt bei der benachrichtigungsbasierten Synchronisierung jedoch auch einige Nachteile:
- Benachrichtigungen sind sehr komplex, da in den meisten Szenarien mehrere Benachrichtigungen für eine Beabsichtigung des Benutzers verwendet werden. Dies gilt insbesondere für den Ordner „Kalender“. Wenn beispielsweise eine einzelne Besprechungsanfrage empfangen wird, werden mehrere Element- und Ordnerbenachrichtigungen erstellt, einschließlich einer Benachrichtigung zum Erstellen des Elements sowie eine weitere Benachrichtigung zum Ändern des Elements. Eine Möglichkeit, um diesen Nachteil zu verhindern, besteht darin, eine Verzögerung von ein paar Sekunden in den Load-, LoadPropertiesForItems-, GetItem- oder GetFolder-Aufruf einzubauen. Wenn Sie im Falle einer Besprechungsanfrage unmittelbar Aufrufe des GetItem-Vorgangs vorgenommen haben, haben Sie vielleicht einen Aufruf zum Erstellen des Elements und einen weiteren zum Ändern des Elements. Durch Verzögern des Aufrufs können Sie stattdessen den GetItem-Vorgang einmal aufrufen und dadurch gleichzeitig die Änderungen abrufen, die mit dem Erstellen und Ändern des Elements einhergehen.
- Benachrichtigungen werden auf dem Postfachserver in der Warteschlange platziert, und Abonnements werden auf dem E-Mail-Server gespeichert. Wenn der Postfachserver, der das Abonnement verwaltet, nicht verfügbar ist, gehen alle neuen Benachrichtigungen verloren, das Postfach wird nicht synchronisiert, und Sie müssen die Benachrichtigungen erneut abonnieren.
- Sie müssen Lösungsstrategien planen für den Fall, dass Benachrichtigungen fehlschlagen. Der zweite Ansatz, das Entwurfsmuster, das nur die Synchronisierung umfasst, ist daher stabiler als die benachrichtigungsbasierte Synchronisierung, da hier der Client nur den Synchronisierungsstatus aufrechterhalten muss – es gibt keine Probleme mit Affinität zum Postfachserver, der das Abonnement verwaltet.
Wenn die benachrichtigungsbasierte Synchronisierung wie empfohlen implementiert wird, basiert dieses Entwurfsmuster auf Folgendem:
- Benachrichtigungen, um zu ermitteln, wann die Daten geändert wurden.
- Auf den Methoden SyncFolderHierarchy oder SyncFolderItems der verwalteten EWS-API oder auf den Vorgängen SyncFolderHierarchy oder SyncFolderItems von EWS, um zu bestimmen, was geändert wurde, wodurch die Anzahl zurückgegebener Synchronisierungsereignisse optimiert wird. Wurde ein neues Element erstellt, aktualisiert oder gelöscht? Das ist alles, was Sie von diesen Methoden wissen müssen. Sie sind für die Eigenschaftenlisten von Änderungen nicht auf die Methoden angewiesen. (Führen Sie keinen GetItem- oder LoadPropertiesForItems-Aufruf für alle zurückgegebenen Elemente oder Ordner aus).
- Verwenden Sie die Methoden Load oder LoadPropertiesForItems in der verwalteten EWS-API oder den GetItem-Vorgang von EWS, um zu ermitteln wie die Daten geändert wurden und um bei Bedarf Eigenschaften vom Server abzurufen, wodurch Batchanforderungen basierend auf der Datenmenge organisiert werden, die zurückgegeben werden. Darauf folgt ein Vergleich der Eigenschaften auf dem Client mit denjenigen, die soeben vom Server zurückgegeben wurden und letztendlich das Erstellen, Löschen oder Ändern des Elements oder Ordners auf dem Client.
Der Ansatz, bei dem nur die Synchronisierung ausgeführt wird, basiert vollständig auf den Methoden SyncFolderItems und SyncFolderHierarchy der verwalteten EWS-API oder auf den EWS-Vorgängen SyncFolderHierarchy oder SyncFolderItems, die Sie entweder fortlaufend oder als zeitlich festgelegtes Ereignis aufrufen. Auch für diesen Ansatz gibt es Vor- und Nachteile. Der Ansatz, bei dem nur die Synchronisierung ausgeführt wird, ist stabiler, weil der Synchronisierungsstatus auf dem Client unter der Postfachebene gespeichert wird und keine eindeutige Beziehung zwischen dem Synchronisierungsstatus und einem Postfachserver erforderlich ist, der das Benachrichtigungsabonnement verwaltet. Die Synchronisierungsansatz kann aufgrund seiner Unabhängigkeit vom Postfachserver ein Postfachfailover überleben. Durch den Synchronisierungsansatz wird jedoch die Latenz für den Benutzer erhöht, da Elemente zeitgesteuert oder zeitweilig synchronisiert werden und nicht in Echtzeit beim Eintreffen von Elementen. Dieser Ansatz ist auch teurer, da Sie Aufrufe der Exchange-Datenbank ausführen, auch wenn möglicherweise keine Änderungen aufgetreten sind.
Bewährte Methoden für die Synchronisierung
Für stark skalierbare Anwendungen empfehlen wir, dass Sie die folgenden bewährten Methoden zum Synchronisieren von Postfächern in Ihrer Anwendung anwenden:
Verwenden Sie beim Aufrufen der Methoden SyncFolderItems oder SyncFolderHierarchy der verwalteten EWS-API den Wert IdOnly für den propertySet-Parameter, oder verwenden Sie bei Verwendung der EWS-Vorgänge SyncFolderHierarchy oder SyncFolderItems den Wert IdOnly für den Wert BaseShape, um Aufrufe der Exchange-Datenbank zu reduzieren. Je mehr Eigenschaften Sie im Eigenschaftensatz des SyncFolderItems- oder SyncFolderHierarchy-Aufrufs anfordern, desto mehr Back-End-Aufrufe werden erstellt. Für jeden angeforderten Eigenschaftenwert wird ein neuer RPC-Aufruf erstellt, wohingegen nur ein RPC-Aufruf vorgenommen wird, um alle ItemIds einer Anforderung abzurufen – unabhängig von der Anzahl zu meldender Ergebnisse. Eine IdOnly-Anforderung führt also zu einem Datenbankaufruf, wohingegen eine Anforderung eines Eigenschaftenbehälters für den Betreff und den Absender zu drei Datenbankaufrufen führt: einer für Subject, einer für Sender und einer für ItemId.
Rufen Sie nicht die Methoden Load oder LoadPropertiesForItems der verwalteten EWS-API oder die EWS-Vorgänge GetItem oder GetFolder für jedes Element in einer Synchronisierungsantwort auf. Analysieren Sie stattdessen die Ergebnisse; suchen Sie nach Änderungen, für die nicht alle Eigenschaften abgerufen werden müssen, z. B. Änderungen des Lesestatus. Wenn eine Antwort eine Änderung des Lesestatus enthält, aktualisieren Sie einfach die Kennzeichnung auf dem Client und schon sind Sie fertig. Sie müssen nicht alle Elementeigenschaften abrufen. Und stellen Sie sicher, dass Sie sich nicht zusätzlichen Aufwand machen, indem Sie Änderungen erstellen, die vom selben Client stammten. Wenn die Synchronisierungsantwort beispielsweise das Löschen eines Elements enthält, und das Löschen erfolgte auf dem lokalen Client, so müssen Sie die Nachricht nicht erneut löschen oder alle Eigenschaften für dieses Element abrufen.
Vermeiden Sie Einschränkungen, indem Sie folgendermaßen vorgehen:
- Wenn Sie die LoadPropertiesForItems-Methode der verwalteten EWS-API oder den EWS-Vorgang GetItem aufrufen, um die Elemente in einem Batch abzurufen, fügen Sie nicht zu viele Elemente in Ihre Anforderung ein; andernfalls kommt es zu einer Drosselung. Wir empfehlen, 10 Elemente pro Batch einzuschließen.
- Stellen Sie nicht zu viele Anforderungen in zu kurzer Zeit. Dies führt auch zu einer Drosselung und zu einer längeren Reaktionszeit.
- Bei der Batchverarbeitung von Elementen sollten Sie alle Elemente mit denselben Werten für die Attribute Id und ChangeKey des FolderId-Elements in einem Batch zusammenfassen.
- Wenn es zu einer Einschränkung kommt, beenden Sie das Senden von Anforderungen. Durch erneutes Senden von Anforderungen dauert die Wiederherstellung länger. Warten Sie stattdessen, bis die Sperrzeit abgelaufen ist, und versuchen Sie dann erneut, Ihre Synchronisierungsanforderungen zu senden.
In Abhängigkeit vom Typ des empfangenen Benachrichtigungsereignisses:
- Rufen Sie für NewMail- oder Modified-Ereignisse die SyncFolderItems-Methode der verwalteten EWS-API oder den EWS-Vorgang SyncFolderItems auf, da Benachrichtigungen keinen ChangeKey bereitstellen und keine Änderungen des Lesestatus aufrufen.
- Wenn das Benachrichtigungsabonnement vor der vorherigen Synchronisierung aktiv war, können Sie bei Deleted-Ereignissen das Ereignis einfach lokal löschen. Sie müssen die SyncFolderItems-Methode der verwalteten EWS-API oder den EWS-Vorgang SyncFolderItems nicht unmittelbar nach dem Löschen aufrufen.
- Wenn ein Modified-Ereignis von einer Änderung des Lesestatus verursacht wurde, rufen Sie nicht die LoadPropertiesForItems-Methode der verwalteten EWS-API oder den EWS-Vorgang GetItem auf, ändern Sie nur die Kennzeichnung des Elements.
Gehen Sie bei der Synchronisierung von Kalenderdaten wie folgt vor:
Verwenden Sie einen Ansatz, der der benachrichtigungsbasierten Synchronisierung ähnlich ist. Da SyncFolderItem keine Kalenderlogik umfasst, verwenden Sie die FindAppointments-Methode der verwalteten EWS-API oder den EWS-Vorgang FindItem Vorgang mit dem CalendarView-Element, um Termine zwischen zwei Datumsangaben anzuzeigen, und rufen Sie dann die LoadPropertiesForItems-Methode der verwalteten EWS-API oder den EWS-Vorgang GetItem auf, um die Elementeigenschaften für das Kalenderelement abzurufen.
Führen Sie keine Abfragen mithilfe der FindAppointments-Methode der verwalteten EWS-API oder des EWS-Vorgangs FindItem Vorgang mit einem CalendarView-Element durch.
Bei der Synchronisierung von Suchordnern:
Verwenden Sie einen Ansatz, der der benachrichtigungsbasierten Synchronisierung ähnlich ist.
Verwenden Sie Benachrichtigungen, um zu ermitteln, wann Daten geändert wurden.
Da Sie SyncFolderItem nicht in einem Suchordner verwenden können, verwenden Sie eine sortierte und ausgelagerte FindItems-Methode der verwalteten EWS-API oder den EWS-Vorgang FindItem mit festgelegtem FractionalPageItemView- und SortOrder-Element, um zu ermitteln, was sich geändert hat.
Verwenden Sie die LoadPropertiesForItems-Methode der verwalteten EWS-API oder den EWS-Vorgang GetItem zum Abrufen von Daten.
Gefilterte Synchronisierung
Dank der SyncFolderItems-Methode der verwalteten EWS-API und des EWS-Vorgangs SyncFolderItems können Sie bestimmte Elemente basierend auf deren ItemIds ignorieren, indem Sie den ignoreItemIds-Parameter in der verwalteten EWS-API oder das Ignore-Element in EWS festlegen. Dies ist ideal, wenn Personen in einer E-Mail-Nachricht, die an alle Mitarbeiter im Unternehmen gesendet wurde, allen antworten möchten.
Sie fragen sich vielleicht, ob Sie Benachrichtigungen filtern (und damit nur die Synchronisierung auslösen) können, wenn sich bestimmte Eigenschaften ändern. Dies erscheint zwar sinnvoll, da Benachrichtigungsabonnements auf dem Typ der Änderung (Erstellen, Aktualisieren, Löschen) basieren und nicht auf der aktualisierten Eigenschaft, es ist aber nicht möglich, Benachrichtigungen derart zu filtern. Sie können stattdessen Folgendes tun:
- Verwenden Sie das benachrichtigungsbasierte Entwurfsmuster.
- Rufen Sie die Methoden SyncFolderItems und SyncFolderHierarchy der verwalteten EWS-API wiederholt auf, wobei der propertySet-Parameter auf IdOnly festgelegt ist, damit Ihr Synchronisierungsstatus aktualisiert wird. Wenn Sie EWS verwenden, rufen Sie die Vorgänge SyncFolderHierarchy und SyncFolderItems wiederholt auf, wobei der Wert BaseShape auf IdOnly festgelegt ist.
- Verwerfen Sie die Antwort (analysieren Sie sie nicht, und führen Sie keine Eigenschaftenvergleiche durch).
- Verwenden Sie FindItems-Methode der verwalteten EWS-API oder den EWS-Vorgang FindItem, und führen Sie eine Sortierung und Auslagerung aus, um die Elemente in dem gefilterten Bereich, der für Sie relevant ist, vorab zu füllen.
- Verwenden Sie den Synchronisierungsstatus, um dann die SyncFolderItems-Methode der verwalteten EWS-API oder den EWS-Vorgang SyncFolderItems aufzurufen, aber überwachen Sie nur die Änderungen in dem gefilterten Elementsatz. Wenn neue Elemente erstellt werden, müssen Sie prüfen, ob sich diese neuen Elemente in Ihrem gefilterten Bereich befinden.
Inhalt dieses Abschnitts
- Synchronisieren von Ordnern unter Verwendung von EWS in Exchange
- Synchronisieren von Elementen unter Verwendung von EWS in Exchange
- Umgang mit Fehlern im Zusammenhang mit der Synchronisierung in EWS in Exchange