web-dev-qa-db-fra.com

Prise en main d'Exchange Web Services 2010

J'ai été chargé d'écrire un SOAP service Web dans .Net pour être un middleware entre EWS2010 et un serveur d'applications qui utilisait auparavant WebDAV pour se connecter à Exchange. ( Si je comprends bien) WebDAV disparaît avec EWS2010, donc le serveur d'applications ne pourra plus se connecter comme il le faisait auparavant, et il est exponentiellement plus difficile de se connecter à EWS sans WebDAV. La théorie est que le faire dans .Net devrait être plus facile que autre chose ... non? !)

Mon objectif final est de pouvoir obtenir et créer/mettre à jour un e-mail , éléments de calendrier, contacts et éléments de liste de tâches pour un compte Exchange spécifié. (La suppression n'est pas actuellement nécessaire, mais je peux l'intégrer pour un examen ultérieur, si c'est assez facile).

On m'a initialement donné un exemple de code, qui fonctionnait en fait, mais je me suis vite rendu compte qu'il était obsolète. Les types et classes utilisés n'apparaissent nulle part dans la documentation actuelle .

Par exemple, la méthode utilisée pour créer une connexion au serveur Exchange était:

ExchangeService svc = new ExchangeService();
svc.Credentials = new WebCredentials(AuthEmailAddress, AuthEmailPassword);
svc.AutodiscoverUrl(AutoDiscoverEmailAddress);

Pour ce que ça vaut, cela utilisait un assembly fourni avec l'exemple de code: Microsoft.Exchange.WebServices.dll ("MEWS").

Avant de me rendre compte que ce n'était pas la façon standard actuelle de réaliser la connexion, et cela a fonctionné, j'ai essayé de construire dessus et d'ajouter une méthode pour créer des éléments de calendrier, que j'ai copié d'ici :

static void CreateAppointment(ExchangeServiceBinding esb)
{
    // Create the appointment.
    CalendarItemType appointment = new CalendarItemType();

    ...
}

Tout de suite, je suis confronté à la différence entre ExchangeService et ExchangeServiceBinding ("ESB"); J'ai donc commencé à googler pour essayer de comprendre comment obtenir une définition ESB afin que la méthode CreateAppointment se compile. J'ai trouvé cet article de blog qui explique comment générer une classe proxy à partir d'un WSDL, ce que j'ai fait.

Malheureusement, cela a provoqué des conflits dans lesquels les types définis dans l'assembly d'origine, Microsoft.Exchange.WebServices.dll (fourni avec l'exemple de code) se chevauchait avec Types dans mon nouveau EWS.dll Assembly (que j'ai compilé à partir du code généré à partir du services.wsdl fourni par le serveur Exchange).

J'ai exclu l'Assemblée MEWS, ce qui n'a fait qu'empirer les choses. Je suis passé d'une poignée d'erreurs et d'avertissements à 25 erreurs et 2 510 avertissements. Toutes sortes de types et de méthodes n'ont pas été trouvées. Quelque chose cloche clairement ici.

Je suis donc retourné à la chasse. J'ai trouvé des instructions sur l'ajout de références de service et de références Web (c'est-à-dire les étapes supplémentaires qu'il faut dans VS2008 ), et je pense que je suis de retour sur la bonne voie.

J'ai supprimé (en fait, pour l'instant, juste exclu) tous les assemblys précédents que j'avais essayés; et j'ai ajouté une référence de service pour https://my.exchange-server.com/ews/services.wsdl

Maintenant, je suis à seulement 1 erreur et 1 avertissement.

Avertissement:
L'élément 'transport' ne peut pas contenir l'élément enfant 'extendedProtectionPolicy' car le modèle de contenu de l'élément parent est vide.

Ceci fait référence à une modification apportée à web.config lorsque j'ai ajouté la référence de service; et je viens de trouver n correctif pour cela ici sur SO . J'ai commenté cette section comme indiqué, et cela a fait disparaître l'avertissement, alors ne vous inquiétez pas.

L'erreur n'a pas été si facile à contourner, cependant:

Erreur:
Le type ou le nom d'espace de nommage 'ExchangeService' est introuvable (manque-t-il une directive using ou une référence d'assembly?)

Cela fait référence à la fonction que j'utilisais pour créer la connexion EWS, appelée par chacune des méthodes Web:

private ExchangeService getService(String AutoDiscoverEmailAddress, String AuthEmailAddress, String AuthEmailPassword)
{
    ExchangeService svc = new ExchangeService();
    svc.Credentials = new WebCredentials(AuthEmailAddress, AuthEmailPassword);
    svc.AutodiscoverUrl(AutoDiscoverEmailAddress);
    return svc;
}

Cette fonction fonctionnait parfaitement avec l'assembly MEWS de l'exemple de code, mais le type ExchangeService n'est plus disponible. (Pas plus que ExchangeServiceBinding, c'est la première chose que j'ai vérifiée.)

À ce stade, puisque je ne suis pas en suivant les instructions de la documentation (je n'ai trouvé nulle part dans la documentation qui disait d'ajouter une référence de service aux services de votre serveur Exchange.wsdl - mais cela semble être le meilleur/plus loin que je suis allé jusqu'ici), j'ai l'impression de voler aveugle.

Je sais que j'ai besoin de comprendre ce qui devrait remplacer ExchangeService/ExchangeServiceBinding, l'implémenter, puis résoudre les erreurs qui surviennent à la suite de ce changement ...

Mais je ne sais pas comment faire ça, ni où chercher pour le faire. La recherche sur "ExchangeService" et "ExchangeServiceBinding" ne semble que ramener à des articles de blog obsolètes et à MSDN, aucun de ces deux éléments ne s'est avéré extrêmement utile jusqu'à présent.

Que dois-je remplacer ExchangeService/ExchangeServiceBinding par? Y a-t-il un autre emplacement où les documents fonctionnant avec EWS sont meilleurs que MSDN?

24
Adam Tuttle

Je recommanderais de passer à l'API Managed EWS. C'est beaucoup plus facile à utiliser que d'essayer de tout bricoler vous-même. Il prend en charge Exchange 2007 SP1 et Exchange 2010. Je pense que vous le trouverez beaucoup plus facile à utiliser et éliminerez probablement vos problèmes.

Version 1: Voici le téléchargement depuis Microsoft .

Et voici les documents MSDN .

Pour la version 2 (merci @ruffin!)

Télécharger - MSDN Docs


Ajouté par le demandeur de questions:

Liens supplémentaires qui se sont révélés utiles:

38
Joe Doyle