Überprüfen der Ergebnisse eines EWS- oder verwalteten EWS-API-Aufrufs

Erfahren Sie, wie Sie die Ergebnisse Ihrer EWS- oder verwalteten EWS-API-Aufrufe überprüfen.

Wenn etwas nicht ordnungsgemäß funktioniert, ist es hilfreich, die SOAP-Anforderungen, die Ihre Anwendung über das Netzwerk sendet, und die Antworten, die der Server zurücksendet, zu untersuchen. Der Artikel Tools und Ressourcen für die Problembehandlung bei EWS-Anwendungen enthält Links zu Tools, die ihnen helfen, diese SOAP-Anforderungen zu erfassen und anzuzeigen. Wie können Sie nach Erhalt der Anfragen und Antworten überprüfen, ob die von Ihnen an den Server gesendete Anfrage, ordnungsgemäß verarbeitet wurde? Lesen Sie weiter, um mehr zu erfahren.

Wenn Sie EWS-Anforderungen senden, beginnen Sie ihre Überprüfung, indem Sie das ResponseClass-Attribut für jede Antwortnachricht in der Antwort überprüfen. Dadurch erfahren Sie, ob der Vorgang für jedes Element erfolgreich abgeschlossen wurde.

Abhängig vom Objekt, das Ihre Methode aufruft, können Sie eine Überprüfung mithilfe der Antwortobjekte durchführen, wenn Sie die verwaltete EWS-API zum Senden von Anforderungen verwenden. Da die SOAP-Antwort jedoch eine Obermenge dessen enthält, was in den Antwortobjekten der verwalteten EWS-API enthalten ist, sollten Sie auch die SOAP-Antwort betrachten. Da die SOAP-Antwort häufig mehr Informationen als die Antwortobjekte der verwalteten EWS-API enthalten kann, starten Sie ihre Überprüfung mit der SOAP-Antwort.

Überprüfen der Ergebnisse einer SOAP-Antwort

Wenn Sie eine SOAP-Antwort erhalten, sollten Sie zuerst das ResponseClass-Attribut betrachten. Dieses Attribut ist in jeder ResponseMessageType-Instanz im ResponseMessages-Element enthalten, wie im folgenden Beispiel gezeigt.

<s:Body>
      <m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
        <m:ResponseMessages>
          <m:GetItemResponseMessage ResponseClass="Success">
          …

Da eine SOAP-Antwort mehrere Antwortnachrichten in einer einzelnen SOAP-Antwort enthalten kann, ist es wichtig, jede Antwortnachricht einzeln zu überprüfen.

Wenn Sie mit einer Operation arbeiten, der eine ResponseClass als Teil der Operationsantwort enthält, wie die folgende, sind Sie möglicherweise versucht, nur die ResponseClass der Operation zu überprüfen.

<soap:Body>
  <m:AddDelegateResponse xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
                         ResponseClass="Success"
                         xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
  …

Der Operationsstatus spiegelt jedoch nur die Form der Antwort auf oberster Ebene wider und nicht den Status aller einzelnen Nachrichtenantworten. Im folgenden Beispiel weist die AddDelegateResponse-Operation eine ResponseClass mit Success auf, aber das zugrunde liegende DelegateUserResponseMessageType-Element hat den ResponseClass-Wert Error.

<soap:Body>
  <m:AddDelegateResponse xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
                         ResponseClass="Success"
                         xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
    <m:ResponseCode>NoError</m:ResponseCode>
    <m:ResponseMessages>
      <m:DelegateUserResponseMessageType ResponseClass="Error">
        <m:MessageText>The user is already a delegate for the mailbox.</m:MessageText>
        <m:ResponseCode>ErrorDelegateAlreadyExists</m:ResponseCode>
        <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
      </m:DelegateUserResponseMessageType>
    </m:ResponseMessages>
  </m:AddDelegateResponse>
</soap:Body>

Für SOAP-EWS-Antworten können Sie sich also nicht auf die ResponseClass der Operation verlassen. Sie müssen sich die ResponseClass jeder Antwortnachricht ansehen, um zu bestimmen, ob bei der Operation Fehler bei der Verarbeitung der Elemente aufgetreten sind.

Überprüfen des Erfolgs

Wenn jedes ResponseClass-Attribut für jedes ResponseMessage-Attribut auf Success festgelegt ist, wurde die Operation für alle Elemente erfolgreich abgeschlossen, und Sie können zur nächsten Aufgabe übergehen.

Das folgende Beispiel zeigt eine erfolgreiche Antwort auf eine GetItem-Operationsanforderung zum Abrufen eines einzelnen Elements. Beachten Sie, dass beim Festlegen der ResponseClass auf Success, der zugeordnete ResponseCode immer auf NoError festgelegt ist.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
        <m:ResponseMessages>
          <m:GetItemResponseMessage ResponseClass="Success">
            <m:ResponseCode>NoError</m:ResponseCode>
            <m:Items>
              <t:Message>
                <t:ItemId Id="Er5bAAA=" 
                          ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAhE0/M" />
                <t:Subject>Dinner Party</t:Subject>
              </t:Message>
            </m:Items>
          </m:GetItemResponseMessage>
        </m:ResponseMessages>
      </m:GetItemResponse>
    </s:Body>

Es folgt eine erfolgreiche Antwort auf eine GetItem-Operationsanforderung zum Abrufen mehrerer Elemente. Jedes der GetItemResponseMessage-Elemente verfügt über die ResponseClassSuccess.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                     xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
    <m:ResponseMessages>
      <m:GetItemResponseMessage ResponseClass="Success">
        <m:ResponseCode>NoError</m:ResponseCode>
        <m:Items>
          <t:Message>
            <t:ItemId Id="Er5bAAA=" 
                      ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAhE0/M" /
            <t:Subject>Dinner Party</t:Subject>
          </t:Message>
        </m:Items>
      </m:GetItemResponseMessage>
      <m:GetItemResponseMessage ResponseClass="Success">
        <m:ResponseCode>NoError</m:ResponseCode>
        <m:Items>
          <t:Message>
            <t:ItemId Id="3c66AAA="
                      ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAc3kqm" />
            <t:Subject>Company Soccer Team</t:Subject>
          </t:Message>
        </m:Items>
      </m:GetItemResponseMessage>
    </m:ResponseMessages>
  </m:GetItemResponse>
</s:Body>

Behandeln von Fehlern und Warnungen

Wenn Sie eine Antwort erhalten und das Attribut ResponseClass auf Error festgelegt ist, wurde die Operation für mindestens ein Element nicht erfolgreich abgeschlossen. Beheben Sie das Problem, und wiederholen Sie die Anforderung oder den Teil Ihrer Anforderung, bei dem ein Fehler aufgetreten ist. Ein ResponseClass-Attributwert mit dem Wert Warning wird nur von der ResolveNames-Operation zurückgegeben und zeigt an, dass die Entität nicht in eine eindeutige Identität aufgelöst werden konnte. Sie können es für alle anderen Operationen ignorieren.

In der folgenden Antwort weist das ResponseClass-Attribut den Wert Error auf.

<m:GetItemResponseMessage ResponseClass="Error">
  <m:MessageText>Property is not valid for this object type.</m:MessageText>
  <m:ResponseCode>ErrorInvalidPropertyRequest</m:ResponseCode>
  <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
  <m:MessageXml>
    <t:FieldURI FieldURI="meeting:AssociatedCalendarItemId" />
  </m:MessageXml>
  <m:Items />
</m:GetItemResponseMessage>

In diesem Beispiel enthält EWS Hinweise zum Debuggen des Problems. Wenn das ResponseClass-Attribut den Wert Error aufweist, sind die folgenden zusätzlichen Elemente in der Antwort enthalten, falls zutreffend:

  • MessageText – Beschreibt den Fehler.

  • ResponseCode – Enthält den Fehlercode, der verwendet werden kann, um weitere Problembehandlungsressourcen zu finden.

  • MessageXml – Identifiziert die Elemente, die den Fehler verursacht haben.

  • DescriptiveLinkKey – Nicht verwendet.

Sie können die in diesen Elementen bereitgestellten Informationen verwenden, um Ihr Problem zu untersuchen. Im vorherigen Beispiel zeigt messageText an, dass die Eigenschaft für den Objekttyp ungültig ist. Die Anforderung bestand darin, eine E-Mail-Nachricht abzurufen, aber der Eigenschaftensatz enthielt die AssociatedCalendarItemId, die nur für Terminelemente gültig ist.

Das folgende Beispiel zeigt einen Fehler, der im Rahmen einer Batchoperation zum Abrufen mehrerer E-Mail-Elemente empfangen wurde. Das erste Element wurde erfolgreich abgerufen, und die ResponseClass ist auf Success festgelegt. Das zweite Element konnte nicht gefunden werden, und die ResponseClass ist auf Error festgelegt.

<m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
  <m:ResponseMessages>
    <m:GetItemResponseMessage ResponseClass="Success">
      <m:ResponseCode>NoError</m:ResponseCode>
      <m:Items>
        <t:Message>
          <t:ItemId Id="Er5cAAA="
                    ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAhE0/O" />
          <t:Subject>Business plans</t:Subject>
        </t:Message>
      </m:Items>
    </m:GetItemResponseMessage>
    <m:GetItemResponseMessage ResponseClass="Error">
      <m:MessageText>The specified object was not found in the store.</m:MessageText>
      <m:ResponseCode>ErrorItemNotFound</m:ResponseCode>
      <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
      <m:Items />
    </m:GetItemResponseMessage>
  </m:ResponseMessages>
</m:GetItemResponse>

Wenn ein oder mehrere Elemente in einer Batchanforderung nicht wie angefordert verarbeitet werden können, wird für jedes fehlerhafte Element ein Fehler zurückgegeben, und die restlichen Elemente im Batch werden wie erwartet verarbeitet. Fehler bei der Batchverarbeitung können auftreten, wenn das Element gelöscht wurde und daher nicht gesendet, abgerufen oder aktualisiert werden kann oder wenn das Element in einen anderen Ordner verschoben wurde und daher eine neue Element-ID hat. Da die Operation für einige Elemente abgeschlossen wird und keinen Fehler zurückgibt, wenn ein oder mehrere Elemente nicht verarbeitet werden können, ist es wichtig, jedes ResponseClass-Attribut zu überprüfen, bevor Sie mit der nächsten Operation fortfahren.

Wenn die von den Antwortelementen bereitgestellten Informationen Ihnen nicht helfen, Ihre Anforderung zu korrigieren oder Sie anderweitig zu entsperren, finden Sie weitere Informationen unter Nächste Schritte.

Überprüfen der Ergebnisse eines EWS- oder verwalteten EWS-API-Aufrufs

Wenn Sie die verwaltete EWS-API verwenden und eine Methode für ein ExchangeService-Objekt aufrufen, gibt die Methode wahrscheinlich ein ServiceResponseCollection-Objekt zurück, das eine Auflistung von ServiceResponse-Objekten enthält, oder eine Auflistung von Objekten, die von den ServiceResponse-Objekten abgeleitet sind. Die ServiceResponseCollection und die enthaltenen ServiceResponse-Objekte beinhalten Informationen über das Ergebnis des Methodenaufrufs, die Sie verwenden können, um Ihre Ergebnisse zu überprüfen.

Wenn Sie die verwaltete EWS-API verwenden und eine Methode für ein Objekt vom Typ Element oder eines der abgeleiteten Objekte aufrufen, gibt die Methode wahrscheinlich kein Antwortobjekt zurück, um den Erfolg zu überprüfen, löst jedoch eine Ausnahme aus, wenn die Methode nicht erfolgreich abgeschlossen wurde.

Überprüfen des Erfolgs

Ein Vorteil der Verwendung der verwalteten EWS-API besteht darin, dass sie beim Umgang mit mehreren Elementen in einer Antwort einen Gesamtstatus bereitstellt. Wenn die aufgerufene Methode also eine ServiceResponseCollection zurückgibt, können Sie überprüfen, ob die Eigenschaft OverallResult der ServiceResponseCollection gleich ServiceResult.Success ist. Wenn ja, wurden alle Elemente im Batchvorgang erfolgreich abgeschlossen. Sie müssen nicht jedes ServiceResponse-Objekt einzeln überprüfen. Wenn die Eigenschaft OverallResult nicht auf ServiceResult.Success festgelegt ist, müssen Sie den Fehler oder die Warnung behandeln.

Wenn die Methode, die Sie aufrufen, keine ServiceResponseCollection, aber ein ServiceResponse-Objekt zurückgibt, müssen Sie den Wert der Eigenschaft Result überprüfen. Wenn der Wert Result auf Success festgelegt ist, wissen Sie, dass die Methode erfolgreich abgeschlossen wurde.

Weist die aufgerufene Methode keinen Rückgabewert auf, gibt es keine Möglichkeit, über die verwaltete EWS-API auf Erfolg zu überprüfen. Solange keine Ausnahme ausgelöst wird, können Sie davon ausgehen, dass die Methode erfolgreich abgeschlossen wurde. Zur weiteren Überprüfung können Sie auch die SOAP-Antwort überprüfen, um die Ergebnisse zu überprüfen.

Behandeln von Fehlern, Warnungen und Ausnahmen

Wenn ihr verwalteter EWS-API-Code eine Ausnahme auslöst, können Sie den Exception.Message-Wert verwenden, um die Fehlerquelle zu ermitteln. Die Eigenschaft Message enthält den Inhalt des MessageText-Elements in der zugrunde liegenden SOAP-Antwort. Wenn die Ausnahme ein Objekt vom Typ ServiceResponseException ist (eine der häufigsten Ausnahmen), können Sie außerdem den ErrorCode im zugrunde liegenden SOAP ResponseCode-Element und die Response-Eigenschaft abrufen, die das zugeordnete ServiceResponse-Objekt identifiziert. Der folgende Code zeigt, wie der Inhalt einer ServiceResponseException erfasst und angezeigt wird.

try
    {
         …
    }
    catch (ServiceResponseException ex)
    {
        Console.WriteLine("Error code: " + ex.ErrorCode);
        Console.WriteLine("Error message: " + ex.Message);
        Console.WriteLine("Response: " + ex.Response);
    }

Wenn die aufgerufene Methode eine ServiceResponseCollection zurückgibt und der Wert der Eigenschaft OverallResultWarnung oder Fehler ist, müssen Sie jedes Objekt in der ServiceResponseCollection durchlaufen, um den Fehler zu finden. Die Eigenschaft OverallResult wird auf Warning festgelegt, wenn für mindestens eine Antwort der Wert Resultauf Warning festgelegt ist und für alle anderen Antworten der Wert Result auf Successfestgelegt ist. Die Eigenschaft OverallResult wird auf Error festgelegt, wenn mindestens eine Antwort den Wert Result auf Errorfestgelegt hat. Wenn die Eigenschaft OverallResult auf Warning oder Error festgelegt ist, werden die folgenden Eigenschaften für die ServiceResponse-Objekte entsprechend festgelegt:

  • ErrorCode – Enthält den Fehlercode, der verwendet werden kann, um weitere Ressourcen zur Problembehandlung zu finden.

  • ErrorDetails – Enthält Details zum Fehler für einige ErrorCodes. Wenn der Fehlercode beispielsweise ErrorRecurrenceHasNoOccurrence lautet, enthält errorDetails die Schlüssel für EffectiveStartDate und EffectiveEndDate.

  • ErrorMessage – Beschreibt den Fehler.

  • ErrorProperties – Identifiziert die Eigenschaften, die den Fehler verursacht haben, wenn verfügbar. Wenn der Fehlercode beispielsweise ErrorInvalidPropertyForOperation lautet, enthält ErrorProperties die Definition der Eigenschaft, die für die Anforderung ungültig war.

  • Ergebnis – Enthält Fehler oder Warnung, wenn ein Problem aufgetreten ist.

Wenn die von den ServiceResponse-Eigenschaften bereitgestellten Informationen nicht ausreichen, um Ihren Methodenaufruf zu korrigieren oder Ihre Sperrung aufzuheben, lesen Sie den Artikel Nächste Schritte, um weitere Informationen zu ErrorCode-Werten zu erhalten.

Weitere Informationen zur Problembehandlung finden Sie in den folgenden Themen:

Je nachdem, was Sie in Ihrer Anforderung erreichen möchten, finden Sie möglicherweise weitere hilfreiche Informationen zum Fehlercode in den folgenden Themen:

Siehe auch