Les webservices Exchange – Comment récupérer l’identifiant d’un objet nouvellement créé

1 minutes read

Maintenant que vous savez créer des objets dans Exchange il est utile de savoir comment récupérer les identifiants attribués à ceux-ci lors de la phase de création.

Les identifiants pour les objets de type Calendrier, Tâche ou Contact dans Exchange sont représentés par la classe ItemIdType qui hérite de BaseItemIdType. Cette classe comporte deux propriétés importantes qui permettent d’identifier un objet et tout ses différents états :

  • Id (Identifiant de l’objet)
  • ChangeKey (Identifiant représentant l’état de l’objet à un instant T. La change Key est modifiée à chaque modification de l’objet)

Afin de pouvoir récupérer les identifiants nous allons modifier les méthodes de création d’objets précédemment écrites en commençant par celle de base.

private static IList<ItemType> CreateItem(
    ExchangeServiceBinding esb,
    TargetFolderIdType folder,
    ItemType[] newItems)
{
    var result = new List<ItemType>();
    var items = new NonEmptyArrayOfAllItemsType();
    items.Items = newItems;

    var cit = new CreateItemType()
    {
        SavedItemFolderId = folder,
        Items = items,
        SendMeetingInvitations = CalendarItemCreateOrDeleteOperationType.SendToNone,
        SendMeetingInvitationsSpecified = true };

    CreateItemResponseType response = esb.CreateItem(cit);

    for (int i = 0; i < response.ResponseMessages.Items.Length; i++)
    {
        var ri = response.ResponseMessages.Items[i];
        var iirmt = ri as ItemInfoResponseMessageType;
        if (iirmt != null && iirmt.Items != null && iirmt.Items.Items != null)
            result.AddRange(iirmt.Items.Items);
    }

    return result;
}

La méthode CreateItem retourne désormais une liste des objets créés. Cette liste est remplie en parcourant la collection des messages de réponse du serveur. Il est nécessaire de caster chaque message de réponse en ItemInfoResponseMessageType pour pouvoir récupérer la liste des objets associés. Sachant que le serveur peut retourner d’autre type de message il est aussi important que ce cast se fasse sans erreurs.

Il faut aussi modifier les autres méthodes appellant CreateItem pour qu’elle retournent aussi cette collection. Exemple avec CreateTask (les autres modifications sont les mêmes) :

private static IList<ItemType> CreateTask(ExchangeServiceBinding esb, TaskType task)
{
    var folder = new TargetFolderIdType {
        Item = new DistinguishedFolderIdType { Id = DistinguishedFolderIdNameType.tasks }
    };

    return CreateItem(esb, folder, new ItemType[] { task });
}

Maintenant dans la méthode principale nous pouvons récupérer l’identifiant de l’objet créé de la manière suivante :

static void Main(string[] args)
{
    var esb = GetExchangeServiceBinding();
    var item = GetTestCalendarItem();

    IList<ItemType> result = CreateCalendarItem(esb, item);

    /* On a créé qu'un seul objet donc on peux directement y accéder par index */
    ItemIdType itemId = result[0].ItemId;
}

Cette fois-ci pas de screenshot par contre, vous comprendrez pourquoi :-)

Updated:

Leave a Comment