Partager via


Vérification des résultats d’un appel EWS ou API managée EWS

Découvrez comment vérifier les résultats de vos appels d’API managée EWS ou EWS.

Lorsque les choses ne fonctionnent pas correctement, il est utile de voir ce qui se passe en examinant les requêtes SOAP envoyées par votre application sur le réseau et les réponses que le serveur renvoie. L'article sur les outils et ressources pour le dépannage des applications EWS comprend des liens vers des outils permettant de capturer et de visualiser ces requêtes SOAP. Une fois que vous avez reçu les demandes et les réponses, comment vérifier que la demande que vous avez envoyée au serveur a été traitée correctement ? Poursuivez la lecture pour en savoir plus.

Si vous envoyez des demandes EWS, vous allez démarrer votre vérification en vérifiant l’attribut ResponseClass pour chaque message de réponse dans la réponse. Cela vous indiquera si l’opération s’est terminée correctement sur chaque élément.

Selon l’objet que votre méthode appelle, si vous utilisez l’API managée EWS pour envoyer des demandes, vous pouvez effectuer une vérification à l’aide des objets de réponse. Toutefois, étant donné que la réponse SOAP contient un sur-ensemble de ce qui est inclus dans les objets de réponse de l’API managée EWS, vous pouvez également examiner la réponse SOAP. Étant donné que la réponse SOAP peut souvent contenir plus d’informations que les objets de réponse de l’API managée EWS, démarrez votre vérification avec la réponse SOAP.

Vérification des résultats d’une réponse SOAP

Lorsque vous recevez une réponse SOAP, la première chose à examiner est l’attribut ResponseClass . Cet attribut est inclus dans chaque instance ResponseMessageType dans l’élémentResponseMessages, comme illustré dans l’exemple suivant.

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

Étant donné qu’une réponse SOAP peut contenir plusieurs messages de réponse dans une réponse SOAP unique, il est important de vérifier chaque message de réponse individuellement.

Si vous travaillez avec une opération qui inclut un ResponseClass dans le cadre de la réponse de l’opération, comme ce qui suit, vous pouvez être tenté de vérifier uniquement le ResponseClass de l’opération.

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

Toutefois, l’état de l’opération reflète uniquement la forme de la réponse de niveau supérieur et ne reflète pas l’état de toutes les réponses de message individuelles. Dans l’exemple suivant, l’opérationAddDelegateResponse a uneResponseClass de Success, mais l’élément DelegateUserResponseMessageType sous-jacent a une valeur ResponseClassdeError.

<soap:Body>
  <m:AddDelegateResponse xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
                         ResponseClass="Success"
                         xmlns:m="http://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>

Par conséquent, pour les réponses SOAP EWS, vous ne pouvez pas vous appuyer sur leResponseClass de l’opération . Vous devez examiner leResponseClass de chaque message de réponse pour déterminer si l’opération a rencontré des erreurs lors du traitement des éléments.

Vérification de la réussite

Si chaque attribut ResponseClass pour chaque attribut ResponseMessage a la valeurSuccess, l’opération s’est terminée correctement sur tous les éléments et vous pouvez passer à votre tâche suivante.

L’exemple suivant montre une réponse réussie à une demande d’opération GetItem pour récupérer un élément unique. Notez que lorsque ResponseClass est définie sur Réussite, le ResponseCode associé est toujours définie sur NoError.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="http://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>

Voici une réponse réussie à une demande d’opération GetItem pour récupérer plusieurs éléments. Chacun des élémentsGetItemResponseMessage a unResponseClass de Success.

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                     xmlns:t="http://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>

Gestion des erreurs et des avertissements

Lorsque vous recevez une réponse et que l’attributResponseClass est défini sur Error, l’opération ne s’est pas terminée correctement sur un ou plusieurs éléments. Corrigez le problème et réessayez votre demande ou la partie de votre demande qui a échoué. Une valeur d’attribut ResponseClass de valeur Warning est retournée uniquement par l’opérationResolveNames et indique que l’entité n’a pas pu être résolue en identité unique. Vous pouvez l’ignorer pour toutes les autres opérations.

Dans la réponse suivante, l’attributResponseClass a la valeur Error.

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

Dans cet exemple, EWS fournit des indices pour déboguer le problème. Lorsque l’attributResponseClass a la valeur Error, les éléments supplémentaires suivants sont inclus dans la réponse le cas échéant :

  • MessageText : décrit l’erreur.

  • ResponseCode : contient le code d’erreur, qui peut être utilisé pour rechercher des ressources de dépannage supplémentaires.

  • MessageXml : identifie les éléments à l’origine de l’erreur.

  • DescriptiveLinkKey : Inutilisé.

Vous pouvez utiliser les informations fournies dans ces éléments pour examiner votre problème. Dans l’exemple précédent, le MessageText indique que la propriété n’est pas valide pour le type d’objet. La demande était d’obtenir un e-mail, mais le jeu de propriétés incluait le AssociatedCalendarItemId, qui n’est valide que pour les éléments de rendez-vous.

L’exemple suivant montre une erreur reçue dans le cadre d’une opération par lot pour obtenir plusieurs éléments de courrier. Le premier élément a été récupéré avec succès et leResponseClass est défini sur Success. Le deuxième élément est introuvable et leResponseClass a la valeur Error.

<m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                        xmlns:t="http://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>

Lorsqu’un ou plusieurs éléments d’une demande par lot ne peuvent pas être traités comme demandé, une erreur est retournée pour chaque élément qui a échoué, et les autres éléments du lot sont traités comme prévu. Des échecs dans le traitement par lots peuvent se produire si l’élément a été supprimé et ne peut donc pas être envoyé, récupéré ou mis à jour, ou si l’élément a été déplacé vers un autre dossier et possède donc un nouvel ID d’élément. Étant donné que l’opération se termine pour certains éléments et ne retourne pas d’erreur lorsqu’un ou plusieurs éléments ne peuvent pas être traités, il est important de vérifier chaque attribut ResponseClass avant de passer à l’opération suivante.

Si les informations fournies par les éléments de réponse ne vous aident pas à corriger votre demande ou à vous débloquer, consultez Étapes suivantes.

Vérification des résultats d’un appel de méthode d’API managée EWS

Si vous utilisez l’API managée EWS et appelez une méthode sur un objet ExchangeService, votre méthode retournera probablement un objet ServiceResponseCollection, qui contient une collection d’objetsServiceResponse ou une collection d’objets dérivés des objets ServiceResponse. LeServiceResponseCollection et les objets ServiceResponse inclus contiennent des informations sur le résultat de l’appel de méthode, que vous pouvez utiliser pour vérifier vos résultats.

Si vous utilisez l’API managée EWS et appelez une méthode sur un objet Item ou l’un des objets dérivés, la méthode ne retourne probablement pas d’objet de réponse pour vérifier la réussite, mais lève une Exception si la méthode ne se termine pas correctement.

Vérification de la réussite

L’un des avantages de l’utilisation de l’API managée EWS est qu’elle fournit un état global lors du traitement de plusieurs éléments dans une réponse. Par conséquent, si la méthode que vous avez appelée retourne une ServiceResponseCollection, vous pouvez vérifier que la propriété OverallResult du ServiceResponseCollection est égale à ServiceResult.Success. Si c’est le cas, tous les éléments du processus par lot ont été correctement effectués ; vous n’avez pas besoin de vérifier chaque objet ServiceResponse individuellement. Si la propriétéOverallResult n’est pas définie sur ServiceResult.Success, vous devez gérer l’erreur ou l’avertissement.

Si la méthode que vous appelez ne retourne pas deServiceResponseCollection, mais retourne un objetServiceResponse, vous devez vérifier la valeur de la propriétéResult. Si la valeurResultest définie surSuccess, vous savez que la méthode s’est terminée correctement.

Si la méthode que vous appelez n’a aucune valeur de retour, il n’existe aucun moyen de vérifier la réussite via l’API managée EWS. Tant qu’une exception n’est pas levée, vous pouvez supposer que la méthode s’est terminée correctement. Pour une validation supplémentaire, vous pouvez également vérifier la réponse SOAP pour vérifier les résultats.

Gestion des erreurs, des avertissements et des exceptions

Si votre code d’API managée EWS lève une Exception, vous pouvez utiliser la valeur Exception.Message pour déterminer la source de l’erreur. La propriété Message contient le contenu de l’élément MessageText dans la réponse SOAP sous-jacente. En outre, si l’exception est de type objet ServiceResponseException, l’une des exceptions les plus courantes, vous pouvez également récupérer leErrorCode contenu dans l’élément SOAP ResponseCode sous-jacent et la propriété Response qui identifie l’objetServiceResponse associé. Le code suivant montre comment intercepter et afficher le contenu d’une ServiceResponseException.

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

Si la méthode que vous avez appelée retourne une ServiceResponseCollection et que la valeur de la propriété OverallResult est égale à Warning ou Error, vous devrez parcourir chaque objet dans laServiceResponseCollection pour rechercher l’erreur. La propriété OverallResult a la valeur Warning si au moins une réponse a sa valeur Result définie sur Warning et que toutes les autres réponses ont leurs valeurs Result définies sur Success. La propriétéOverallResult est définie sur Error si au moins une réponse a sa valeur Result définie sur Error. Lorsque leOverallResult est défini sur Warning ou Error, les propriétés suivantes sont définies sur les objets ServiceResponse selon le cas :

  • ErrorCode : contient le code d’erreur, qui peut être utilisé pour rechercher des ressources de dépannage supplémentaires.

  • ErrorDetails : contient des détails sur l’erreur de certains ErrorCodes. Par exemple, lorsque le code d’erreur est ErrorRecurrenceHasNoOccurrence, leErrorDetails contient des clés pour EffectiveStartDate et EffectiveEndDate.

  • ErrorMessage : décrit l’erreur.

  • ErrorProperties: si disponible, identifie les propriétés à l’origine de l’erreur. Par exemple, lorsque le code d’erreur est ErrorInvalidPropertyForOperation, ErrorProperties contient la définition de la propriété qui n’était pas valide pour la demande.

  • Résultat : contient Errorou Warning lorsqu’un problème est rencontré.

Si les informations fournies par les propriétés ServiceResponse ne fournissent pas suffisamment d’informations pour corriger votre appel de méthode ou vous débloquer, consultez Étapes suivantes pour rechercher plus d’informations sur les valeursErrorCode.

Vous pouvez rechercher des informations de dépannage supplémentaires dans les rubriques suivantes :

En outre, en fonction de ce que vous essayez d’accomplir dans votre demande, vous pouvez trouver des informations utiles supplémentaires sur le code d’erreur dans les rubriques suivantes :

Voir aussi