Les webservices Exchange – Comment récupérer une liste de contacts

2 minutes read

Vous savez maintenant créer et supprimer des éléments, à partir d’aujourd’hui et pour quelques articles je vais cous montrer différentes manières de récupérer des objets stockés dans Exchange.

Aujourd’hui un exemple avec les contacts.

private static IEnumerable<ContactItemType> GiveMeSomeContacts(
    ExchangeServiceBinding esb,
    int count)
{
    List<ContactItemType> contacts = new List<ContactItemType>();
    FindItemType fit = new FindItemType();

    /* Paramètres de pagination de la recherche */ fit.Item = new IndexedPageViewType {
        /* On commence à l'index 0 à partir du début */ Offset = 0,
        BasePoint = IndexBasePointType.Beginning,

        /* On spécifie le nombre d'éléments à renvoyer par page */ MaxEntriesReturnedSpecified = true,
        MaxEntriesReturned = count
    };

    /* On défini une liste de propriété sur lesquelles trier */ fit.SortOrder = new[]
    {
        new FieldOrderType {
            /* Chemin de la propriété sur laquelle trier */ Item = new PathToUnindexedFieldType {
                /* On tri en fonction du "libellé" du contact */ FieldURI = UnindexedFieldURIType.contactsFileAs
            },
            Order = SortDirectionType.Ascending
        }
    };

    /* On récupère l'ensemble de propriétés par défaut de l'objet */ fit.ItemShape = new ItemResponseShapeType {
        /* On renvoie les propriétés par défaut */ BaseShape = DefaultShapeNamesType.Default
    };

    /* Liste des dossiers dans lesquels effectuer la recherche */ fit.ParentFolderIds = new[]
    {
        new DistinguishedFolderIdType { Id = DistinguishedFolderIdNameType.contacts }
    };

    /* Requête de recherche */ FindItemResponseType response = esb.FindItem(fit);

    /* On parcours les résultats de la requête et on ajoute les contacts à notre liste */ IterateFindItemResult<ContactItemType>(response, c => contacts.Add(c));

    return contacts;
}

J’attire votre attention sur l’énumération DefaultShapeNamesType. Celle-ci permet de définir la liste des propriétés à renvoyer :

  • Si vous n’avez besoin que des identifiants il vaux mieux sélectionner Default.ShapeNamesType.IdOnly car celà permet d’économiser de la bande passante.
  • Si vous souhaitez la liste classique des propriétés par défaut, selectionnez DefaultShapeNamesType.Default.
  • Dans le cas où toutes les propriétés sont nécessaires selectionnez DefaultShapeNamesType.AllProperties. Attention cependant, choisir cette valeur va utiliser beaucoup de bande passante.

J’ai ici introduit une méthode que je réutiliserai pour les autres types d’objets dans les articles suivants. Cette méthode parcours la liste des réponses contenues dans le résultat de la requête de recherche et exécute une action pour chaque objet trouvé.

private static void IterateFindItemResult<T>(
    FindItemResponseType response,
    Action<T> action)
    where T : ItemType {
    if (action == null)
        return;

    /* On parcours toutes les réponses de la requête de recherche */ for (int i = 0; i < response.ResponseMessages.Items.Length; i++)
    {
        var ri = response.ResponseMessages.Items[i];
        var firmt = ri as FindItemResponseMessageType;

        if (firmt != null)
        {
            /* Dossier contenant les résultats */ FindItemParentType fipt = firmt.RootFolder;

            /* Tableau des résultats */ var aorit = fipt.Item as ArrayOfRealItemsType;

            if (aorit != null && aorit.Items != null)
                for (int j = 0; j < aorit.Items.Length; j++)
                    action(aorit.Items[j] as T);
        }
    }
}

C’est tout pour aujourd’hui.

Updated:

Leave a Comment