Академический Документы
Профессиональный Документы
Культура Документы
Chapitre 29
Les chapitres prcdents vous ont montr comment construire des applications bureautiques monopostes qui peuvent effectuer une grande varit de tches. Cependant, trs peu de systmes oprent aujourdhui sans tre connects. Une entreprise effectue des oprations commerciales et possde en gnral des applications rseau qui prennent en charge ces activits. De plus, nous sommes maintenant lre dInternet et une entreprise peut composer des solutions qui incorporent diffrents services tiers. Le dfi est darriver combiner ces morceaux ensemble pour leur permettre de communiquer et de cooprer dune manire transparente. Les services Web fournissent une solution ce problme. Grce eux, vous pouvez gnrer des systmes distribus partir des lments qui sont diffuss sur Internet (les bases de donnes, les services mtiers, etc.). Les composants et les services sont hbergs par un serveur Web qui reoit des
demandes dune application cliente, les analyse, et envoie la commande correspondante au composant ou service. La rponse est route via le serveur Web vers lapplication cliente. Le but de ce chapitre est de vous montrer comment concevoir, gnrer et tester des services Web qui peuvent tre intgrs dans des applications distribues. Vous allez galement apprendre construire une application cliente qui utilise des mthodes exposes par un service Web.
Note Le but de ce chapitre est de fournir une introduction trs sommaire aux services Web et WCP (Windows Communication Foundation). Si vous souhaitez des informations dtailles sur le fonctionnement de WCF et la manire de gnrer des services scuriss avec WCF, vous devez consulter un ouvrage tel que Microsoft Windows Communication Foundation Step by Step, publi par Microsoft Press, 2007.
clientes en C#.
porent des services Web hbergs par des entreprises tierces, elles peuvent implmenter ces services Web en utilisant chacun de ces modles, si bien que cela vous aidera davoir une bonne comprhension des deux architectures qui sont dcrites brivement dans les sections suivantes.
Rle de SOAP
SOAP est le protocole utilis par les applications clientes pour envoyer des demandes et recevoir des rponses des services Web. SOAP est un protocole lger construit au sommet de HTTP. SOAP dfinit une grammaire XML pour spcifier les noms des mthodes Web que le client peut appeler sur un service Web, pour dfinir les paramtres et retourner des valeurs, et pour dcrire les types des paramtres et retourner des valeurs. Lorsquun client appelle un service Web, il doit spcifier la mthode et les paramtres en utilisant cette grammaire XML. SOAP est une norme industrielle dont la fonction est damliorer linteroprabilit entre les plateformes. La force de SOAP est sa simplicit et aussi le fait quil soit bas sur dautres technologies normalises, comme HTTP et XML. La spcification SOAP dfinit notamment les lments suivants : Le format dun message SOAP La manire dont les donnes doivent tre encodes
La manire dont les messages sont envoys La manire dont les rponses sont traites Les descriptions des dtails exacts du fonctionnement de SOAP et le format interne dun message SOAP dpassent le cadre de cet ouvrage. Il est trs improbable que vous ayez un jour besoin de crer et de mettre en forme des messages SOAP manuellement car beaucoup doutils de dveloppement, y compris Visual Studio 2010, automatisent ce traitement, en prsentant une API simple aux dveloppeurs construisant des services Web et des applications clientes.
scurit. Par exemple, un service Web peut utiliser uniquement une forme relativement simple de chiffrement qui peut ainsi tre facilement cass. Un client envoyant des informations hautement confidentielles ce service Web insistera probablement sur un niveau lev de scurit. Ceci est un exemple de stratgie, mais on peut citer aussi la qualit de service et la fiabilit du service Web. Lapplication cliente et le service Web peuvent ngocier le niveau de service quils souhaitent utiliser en fonction des exigences et du cot. Cependant, cette ngociation exige que le client et le service Web aient une comprhension commune des stratgies disponibles. La spcification WSPolicy fournit un modle gnrique et une syntaxe correspondante pour dcrire et communiquer les stratgies quun service Web implmente. Routage et adressage Il est utile pour un serveur Web dtre capable de rediriger une demande de service Web vers une machine dun groupe dordinateurs hbergeant des instances du service. Par exemple, de nombreux systmes volutifs utilisent lquilibrage de charge, o les demandes envoyes un serveur Web sont en fait rediriges par ce serveur vers dautres ordinateurs pour rpartir la charge sur ces ordinateurs. Le serveur peut utiliser nimporte quel algorithme pour essayer de rpartir la charge. Le point important est que cette redirection est transparente pour le client effectuant la demande de service Web, et le serveur qui gre par la suite la demande doit savoir o envoyer les rponses quil gnre. Rediriger les demandes de service Web est galement utile si un administrateur a besoin darrter un ordinateur pour effectuer de la maintenance. Les demandes qui ont t envoyes cet ordinateur peuvent ainsi tre rediriges vers une des machines du groupe. La spcification WSAddressing dcrit un systme capable de rediriger les demandes de service Web.
Note Les dveloppeurs parlent de spcifications WS-* pour faire rfrence aux spcifications WS-Security, WS-Policy et WS-Addressing.
Laccs cette URL fait rechercher par le service Web les donnes de lemploy n 7. Ces donnes peuvent tre retournes dans de nombreux formats, mais pour des raisons de portabilit, les formats les plus courants sont XML (parfois appel Plain Old XML ou POX) et JavaScript Object Notation (ou JSON). Si lentreprise Northwind Traders choisit dutiliser POX, le rsultat retourn en interrogeant lURL ci-dessus sera le suivant :
<Employee> <EmployeeID> 7 </EmployeeID> <LastName> King </LastName> <FirstName> Robert </FirstName> <Title> Sales Representative </Title> </Employee>
Pour concevoir une solution base sur REST, vous devez bien comprendre comment il divise un modle mtier en un ensemble de ressources. Dans certains cas, tels que les employs, cela peut tre simple, mais dans dautres situations cela est un vritable dfi. Le modle REST repose sur lapplication qui accde aux donnes en envoyant le verbe HTTP appropri dans la demande utilise pour accder aux donnes. Par exemple, la demande simple illustre prcdemment doit envoyer une demande HTTP GET au service Web. HTTP prend en charge bien dautres verbes, tels que POST, PUT, et DELETE, que vous pouDunod 2010 Visual C#2010 tape par tape John Sharp
vez utiliser respectivement pour crer, modifier, et supprimer des ressources. En utilisant le modle REST, vous pouvez exploiter ces verbes et concevoir des services Web qui peuvent mettre jour les donnes. la diffrence de SOAP, les messages envoys et reus en utilisant le modle REST tendent tre bien plus compacts. Ceci sexplique principalement par le fait que REST ne fournit pas les mmes facilits de routage, stratgie et de scurit que les spcifications WS-*, et vous devez vous reposer sur linfrastructure sous-jacente fournie par le serveur Web pour protger les services Web REST. Cependant, cette approche minimaliste signifie quun service Web REST est habituellement bien plus efficace que le service Web SOAP quivalent lorsquil transmet et reoit des messages.
puis tester la mthode Web pour sassurer quelle fonctionne comme prvu.
Important Vous ne pouvez pas concevoir des services Web en utilisant Microsoft Visual C# 2010 Express. la place, vous devez utiliser Microsoft Visual Web Developer 2010 Express. Vous pouvez tlcharger Visual Web Developer 2010 Express gratuitement partir du site Web de Microsoft.
dans le dossier qui contient les fichiers du site Web. Vous pouvez ouvrir un projet de site Web existant soit en trouvant et en ouvrant le fichier de solution appropri, soit en utilisant la commande Ouvrir Site Web du menu Fichier puis en spcifiant le dossier qui contient les fichiers du site Web. Vous pouvez galement copier le fichier de solution dun site Web vers le dossier contenant les fichiers du site Web, mais ce nest pas recommand dans un environnement de production, pour des raisons de scurit.
5. Cliquez sur le projet C:\...\ServiceInformationsProduit\. Dans la fentre Proprits, initialisez la proprit Utiliser des ports dynamiques False et la proprit Numro de port 4500.
Note Il est possible que vous deviez attendre quelques secondes aprs avoir initialis la proprit Utiliser des ports dynamiques False avant de pouvoir initialiser la proprit Numro de port.
Un port spcifie un emplacement o le serveur Web coute les demandes entrantes des applications clientes. Par dfaut, le serveur Web de dveloppement fourni avec Visual Studio 2010 choisit un port alatoirement pour rduire les chances de collision avec dautres ports utiliss par dautres services rseau sexcutant sur votre ordinateur. Cette fonctionnalit est utile si vous gnrez et testez des sites Web ASP.NET dans un environnement de dveloppement avant de les copier vers un serveur de production comme IIS. Cependant, lorsque vous gnrez un service Web, il est plus utile dutiliser un numro de port fixe car les applications clientes ont besoin de pouvoir se connecter celui-ci.
Note Lorsque vous fermez un site Web puis louvrez nouveau en utilisant Visual Studio ou Visual Web Developer, la proprit Utiliser des ports dynamiques repasse frquemment True et la proprit Numro de port est initialise un port alatoire. Dans ce cas, rinitialisez ces proprits aux valeurs dcrites dans cette tape.
6. Dans lExplorateur de solutions, dveloppez le dossier App_Code sil nest pas dj ouvert, faites un clic droit sur le fichier Service.cs, puis Dunod 2010 Visual C#2010 tape par tape John Sharp
Chapitre 29 Cration et utilisation dun service Web cliquez sur Renommer. Modifiez le nom du fichier en InformationsProduit.cs. 7. En utilisant la mme technique, modifiez le nom du fichier IService.cs en IInformationsProduit.cs. 8. Faites un double clic sur le fichier IInformationsProduit.cs pour lafficher dans la fentre Code. Ce fichier contient la dfinition dune interface appele IService. En haut de ce fichier IInformationsProduit.cs, vous trouverez des instructions using faisant rfrence aux espaces de noms System, System.Collections.Generic, et System.Text (que vous avez rencontrs auparavant), suivies par deux instructions supplmentaires faisant rfrence aux espaces de noms System.ServiceModel et System.Runtime.Serialization. Lespace de noms System.ServiceModel contient les classes utilises par WCF pour dfinir des services et leurs oprations. WCF utilise les classes de lespace de noms System.Runtime.Serialization pour convertir les objets en un flux de donnes pour la transmission sur le rseau (traitement appel srialisation) et pour annuler cette conversion (dsrialisation). Vous en apprendrez davantage sur la faon dont WCF srialise et dsrialise les objets plus tard dans ce chapitre. Le contenu principal du fichier IInformationsProduit se compose dune interface appele IService et dune classe appele CompositeType. Linterface IService est prfixe avec lattribut ServiceContract, et la classe CompositeType est balise avec lattribut DataContract. En raison de la structure dun service WCF, vous pouvez adopter une approche contract-first (priorit au contrat) pour le dveloppement. Lorsque vous effectuez du dveloppement contract-first , vous dfinissez les interfaces, ou contracts, que le service implmentera, puis vous gnrez un service conforme ces contracts. Ce nest pas une nouvelle technique, et vous avez vu des exemples de cette stratgie tout au long de cet ouvrage. Le point important derrire lutilisation du dveloppement contract-first est que vous pouvez vous concentrer sur la conception de votre service. Si ncessaire, il peut rapidement tre revu pour assurer que votre conception nintroduit pas des dpendances du matriel ou des logiciels spcifiques avant deffectuer trop de dveloppement ; rappelez-vous que dans de Dunod 2010 Visual C#2010 tape par tape John Sharp
nombreux cas les applications clientes pourraient ne pas tre gnres avec WCF et pourraient mme ne pas sexcuter sous Windows. Lattribut ServiceContract marque une interface comme dfinissant les mthodes que la classe qui implmente le service Web exposera en tant que mthodes Web. Les mthodes elles-mmes sont balises avec lattribut OperationContract. Les outils fournis avec Visual Studio 2010 utilisent ces attributs pour aider gnrer le document WSDL appropri pour le service. Toutes les mthodes de linterface non marques avec lattribut OperationContract ne seront pas incluses dans le document WSDL et par consquent ne seront pas accessibles aux applications clientes utilisant le service Web. Si une mthode Web prend des paramtres ou retourne une valeur, les donnes de ces paramtres et de cette valeur doivent tre converties en un format qui peut tre transmis sur le rseau puis reconverti nouveau en objets (cest le traitement appel srialisation et dsrialisation mentionn prcdemment). Les diffrents standards de services Web dfinissent des mcanismes pour spcifier le format de types de donnes simples, comme les nombres et les chanes, dans la description WSDL dun service Web. Cependant, vous pouvez aussi dfinir vos propres types de donnes complexes bass sur des classes et des structures. Si vous utilisez ces types dans un service Web, vous devez fournir des informations sur la faon de les srialiser et dsrialiser. Si vous regardez la dfinition de la mthode GetDataUsingDataContract de linterface IService, vous pouvez voir quelle attend un paramtre du type CompositeType. La classe CompositeType est marque avec lattribut DataContract, qui spcifie que la classe doit dfinir un type qui peut tre srialis et dsrialis en tant que flux XML dune demande SOAP ou dun message de rponse. Chaque membre que vous souhaitez inclure dans le flux srialis envoy sur le rseau doit tre marqu avec lattribut DataMember. 9. Faites un double clic sur le fichier InformationsProduit.cs pour lafficher dans la fentre Code. Ce fichier contient une classe appele Service qui implmente linterface IService et fournit les mthodes GetData et GetDataUsingDataContract dfinies par cette interface. Cette classe est le service Web. Lorsquune application cliente appelle une mthode Web de Dunod 2010 Visual C#2010 tape par tape John Sharp
ce service Web, elle gnre un message de demande SOAP et lenvoie au serveur Web hbergeant le service Web. Le serveur Web cr une instance de cette classe et excute la mthode correspondante. Lorsque la mthode se termine, le serveur Web construit un message de rponse SOAP, quelle renvoie lapplication cliente. 10. Faites un double clic sur le fichier Service.svc pour lafficher dans la fentre Code. Cest le fichier de service du service Web ; il est utilis par lenvironnement hte (IIS, dans ce cas) pour dterminer quelle classe charger lorsquil reoit une demande de lapplication cliente. La proprit Service de la directive @ ServiceHost spcifie le nom de la classe du service Web, et la proprit CodeBehind spcifie lemplacement du code source de cette classe.
Astuce Si vous ne souhaitez pas dployer le code source de votre service WCF vers le serveur Web, vous pouvez fournir la place un assembly compil. Vous pouvez ensuite spcifier le nom et lemplacement de cet assembly en utilisant la directive @ Assembly. Pour plus dinformations, cherchez directive @ Assembly dans la documentation fournie avec Visual Studio 2010.
Maintenant que vous avez vu la structure dun service WCF, vous pouvez dfinir linterface qui spcifie le contrat de service du service Web InformationsProduit puis crer une classe qui implmente ce contrat de service.
IInformationsProduit dans tous les fichiers du projet. La ligne qui dfinit linterface dans la fentre Code doit ressembler ceci :
public interface IInformationsProduit { ... }
3. Dans linterface IInformationsProduit, supprimez les dfinitions des mthodes GetData et GetDataUsingDataContract et remplacez-les par la mthode CombienCaCoutera illustre en gras. Assurez-vous de conserver lattribut OperationContract de la mthode Web.
[ServiceContract] public interface IInformationsProduit { [OperationContract] decimal CombienCaCoutera(int idProduit, int combien); }
La mthode CombienCaCoutera prend un ID produit et une quantit puis retourne une valeur decimal spcifiant ce que cette quantit cotera. 4. Supprimez la classe CompositeType, en incluant lattribut DataContract, du fichier IInformationsProduit.cs. Le fichier doit contenir uniquement la dfinition de linterface IInformationsProduit. La prochaine tape consiste dfinir la classe InformationsProduit, qui implmente linterface IInformationsProduit. La mthode CombienCaCoutera de cette classe rcuprera le prix du produit partir de la base de donnes en effectuant une requte ADO.NET simple.
Note Les services Web que vous concevez dans ce chapitre accdent la base de donnes Northwind. Si vous ne lavez pas dj fait, vous pouvez crer cette base de donnes en suivant les tapes de la section Cration de la base de donnes du chapitre 25, Recherche d'informations dans une base de donnes .
Vous devez vous souvenir (voir le chapitre 25) que ces espaces de noms contiennent les types ncessaires pour accder une base de donnes Microsoft SQL Server et interroger des donnes. 3. Dans la ligne de code qui dfinit la classe Service, faites un double clic sur le nom Service pour le surligner. Dans le menu Refactoriser, cliquez sur Renommer. Dans la bote de dialogue Renommer, saisissez InformationsProduit dans la zone de texte Nouveau nom puis cliquez sur OK. Comme dans lexercice prcdent, cette action modifie le nom de la classe Service InformationsProduit et modifie galement toutes les rfrences de cette classe en InformationsProduit dans tous les fichiers du projet. La ligne qui dfinit la classe dans la fentre Code doit ressembler ceci :
public class InformationsProduit : IInformationsProduit { ... }
4. Supprimez les mthodes GetData et GetDataUsingDataContract de la classe InformationsProduit. 5. Ajoutez la mthode CombienCaCoutera la classe InformationsProduit, illustre ici en gras :
public class InformationsProduit : IInformationsProduit { public decimal CombienCaCoutera(int idProduit, int combien) { SqlConnection connexionDonnees = new SqlConnection(); decimal coutTotal = 0; try {
generateur.IntegratedSecurity = true; connexionDonnees.ConnectionString = generateur.ConnectionString; connexionDonnees.Open(); SqlCommand commandeDonnees = new SqlCommand(); commandeDonnees.Connection = connexionDonnees; commandeDonnees.CommandType = CommandType.Text; commandeDonnees.CommandText = "SELECT UnitPrice FROM WHERE ProductID = @ProductID";
Products
SqlParameter parametreIDProduit = new SqlParameter("@ProductID", SqlDbType.Int); parametreIDProduit.Value = idProduit; commandeDonnees.Parameters.Add(parametreIDProduit); decimal? prix = commandeDonnees.ExecuteScalar() as decimal?; if (prix.HasValue) { coutTotal = prix.Value * combien; }
Cette mthode se connecte la base de donnes et excute une requte ADO.NET pour rcuprer le cot du produit correspondant lID produit fourni la base de donnes Northwind. Si le cot retourn nest pas null, la mthode calcule le cot total de la requte et le retourne ; sinon, la mthode retourne la valeur 0. Le code est similaire celui illustr au chapitre 25, except quil utilise la mthode ExecuteScalar pour lire la valeur de la colonne UnitPrice (prix unitaire) de la base de donnes. La mthode ExecuteScalar fournit un mcanisme trs efficace pour excuter des requtes qui retournent une seule valeur scalaire (et bien plus efficace que douvrir un curseur et de lire les donnes du curseur). La valeur retourne par ExecuteScalar est un object, si bien que vous devez le caster avec le type appropri avant de lutiliser.
Important Cette mthode neffectue aucune validation des paramtres dentre. Par exemple, vous pouvez spcifier une valeur ngative pour le paramtre combien. Dans un service Web de production, vous intercepterez ce genre derreurs, les enregistrerez et retournerez une exception. Cependant, la transmission dune exception une application cliente a des implications sur la scurit dun service WCF. Ces dtails dpassent le cadre de ce livre. Pour plus dinformations, voir Microsoft Windows Communication Foundation Step by Step.
Avant de pouvoir utiliser le service Web, vous devez mettre jour la configuration du fichier Service.svc pour faire rfrence la classe InformationsProduit du fichier InformationsProduit.cs. Le serveur Web utilise les informations du fichier Web.config cr avec le projet pour contenir des informations sur la faon de publier le service et de le rendre disponible aux applications clientes. Vous devez modifier le fichier Web.config et ajouter les dtails du service Web. Configuration du service Web 1. Dans lExplorateur de solutions, faites un double clic sur le fichier Service.svc pour lafficher dans la fentre Code. Mettez jour les attributs Service et CodeBehind de la directive ServiceHost, comme indiqu en gras ici :
<%@ ServiceHost Language="C#" Debug="true" Service="InformationsProduit" CodeBehind="~/App_Code/InformationsProduit.cs" %>
2. Dans lExplorateur de solutions, faites un double clic sur le fichier Web.config. Dans la fentre Code, recherchez llment <system.serviceModel>. On utilise cet lment pour spcifier la configuration dun service WCF. Cet lment contient actuellement un lment <behaviors>, que vous pouvez ignorer pour le moment. 3. Dans le fichier Web.config, ajoutez llment <services> et les lments enfants illustrs en gras llment <system.serviceModel>, avant llment <behaviors> :
<system.serviceModel> <services> <service name="InformationsProduit"> <endpoint address="" binding="wsHttpBinding" contract="IInformationsProduit"/>
Cette configuration spcifie le nom de la classe qui implmente le service Web (InformationsProduit). WCF utilise la notion de points de terminaisons pour associer une adresse rseau avec un service Web spcifique. Si vous hbergez un service Web en utilisant IIS ou le serveur Web de dveloppement, vous devez laisser la proprit address de votre point de terminaison vide car ces serveurs coutent les demandes entrantes sur une adresse spcifie par leurs propres informations de configuration. Vous pouvez gnrer vos propres applications htes personnalises si vous ne voulez pas utiliser IIS ou le serveur de dveloppement. Dans ce genre de situations, vous devez spcifier une adresse pour le service dans la dfinition du point de terminaison. Le paramtre binding indique le protocole rseau que le serveur utilise pour recevoir des demandes et transmettre des rponses. Pour plus dinformations sur les points de terminaison, les htes personnaliss, et les liaisons, reportez-vous Microsoft Windows Communication Foundation Step by Step, publi par Microsoft Press. 4. Dans le menu Fichier, cliquez sur Enregistrer tout. 5. Dans lExplorateur de solutions, faites un clic droit sur Service.svc, puis cliquez sur Afficher dans le navigateur. Internet Explorer dmarre et affiche la page suivante, ce qui confirme que vous avez cr et dploy avec succs le service Web et fourni des informations utiles dcrivant la manire de crer une application cliente simple pouvant accder au service Web.
Note Si vous cliquez sur le lien indiqu sur la page Web (http://localhost:4500/ServiceInformationsProduit/Service.svc?wsdl), Internet Explorer affiche une page contenant la description WSDL du service Web. Il sagit dun code XML long et complexe, mais Visual Studio 2010 peut prendre les informations de cette description et les utiliser pour gnrer une classe quune application cliente peut employer pour communiquer avec le service Web.
met au client comme un retour de nimporte quel appel de mthode simple. Cest lapproche que vous allez adopter dans les exercices de cette section.
2. Dans la seconde instance de Microsoft Visual Studio 2010, ouvrez la solution ClientProduit du dossier \Visual C Sharp Etape par tape\Chapitre 29\ClientProduit de votre dossier Documents. 3. Dans lExplorateur de solutions, faites un double clic sur le fichier Dunod 2010 Visual C#2010 tape par tape John Sharp
ClientProduit.xaml pour afficher le formulaire dans la fentre Concepteur. Le formulaire ressemble ceci :
Le formulaire permet lutilisateur de spcifier un ID produit et de rcuprer les dtails du produit de la base de donnes Northwind. Lutilisateur peut aussi fournir une quantit et rcuprer un prix dachat pour cette quantit du produit. Actuellement, les boutons du formulaire ne font rien. Dans les tapes suivantes, vous allez ajouter le code ncessaire pour appeler les mthodes du service Web InformationsProduit afin dobtenir les donnes et les afficher.
4. Modifiez la valeur dans la zone de texte Espace de noms ServiceInformationsProduit puis cliquez sur OK. Un nouveau dossier appel Service References apparat dans lExplorateur de solutions. Ce dossier contient un lment appel ServiceInformationsProduit. 5. Cliquez sur le bouton Afficher tous les fichiers dans la barre doutils Explorateur de solutions. Dveloppez le dossier ServiceInformationsProduit, puis dveloppez le dossier Reference.svcmap. Faites un double clic sur le fichier Reference.cs et examinez son contenu dans la fentre Code. Ce fichier contient plusieurs classes et interfaces, notamment une classe nomme InformationsProduitClient dans un espace de noms appel ClientProduit.ServiceInformationsProduit. La classe InformationsProduitClient est la classe proxy gnre par Visual Studio 2010 partir de la description WSDL du service Web InformationsProduit. Elle contient un certain nombre de constructeurs, mais aussi une mthode appele CombienCaCoutera. Le code suivant montre quelques lments importants de ce fichier qui a t remis en forme pour le rendre un peu plus lisible :
namespace ClientProduit.ServiceInformationsProduit { ... [System.ServiceModel.ServiceContractAttribute(...)] public interface IInformationsProduit {
} ... ... public partial class InformationsProduitClient : System.ServiceModel.ClientBase<ClientProduit.ServiceInformationsProduit.IInf ormationsProduit>, ClientProduit.ServiceInformationsProduit.IInformationsProduit { public InformationsProduitClient() { } public InformationsProduitClient(string endpointConfigurationName) : base(endpointConfigurationName) { } public InformationsProduitClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public InformationsProduitClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public InformationsProduitClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(binding, remoteAddress) { } public decimal CombienCaCoutera(int idProduit, int combien) { return base.Channel.CombienCaCoutera(idProduit, combien); }
Linterface InformationsProduit est similaire linterface que vous avez dfinie dans le service Web, except que certains attributs spcifient des paramtres supplmentaires (le but de ces paramtres dpasse le cadre de ce chapitre). La classe InformationsProduit implmente cette interface, mais hrite aussi de la classe gnrique ClientBase. La classe ClientBase de lespace de noms System.ServiceModel fournit les fonctionnalits de communication de base dont une application cliente a besoin pour communiquer avec un service Web. Le para-
mtre de type spcifie linterface que la classe implmente. La classe ClientBase fournit la proprit Channel, qui encapsule une connexion HTTP un service Web. Les diffrents constructeurs de la classe InformationsProduitClient configurent le canal pour la connecter au point de terminaison que le service Web coute. Lapplication cliente peut instancier la classe InformationsProduitClient, en spcifiant le point de terminaison connecter, puis appeler la mthode CombienCaCoutera. Lorsque cela arrive, le canal de la classe sous-jacente ClientBase empaqute les informations fournies comme paramtres dans un message SOAP quil transmet au service Web. Lorsque le service Web rpond, les informations retournes sont dsempaquetes partir de la rponse SOAP et retransmises lapplication cliente. De cette faon, lapplication cliente peut appeler une mthode dun service Web exactement de la mme faon quelle appellerait une mthode locale.
Note Vous avez peut-tre remarqu que linterface est marque avec ServiceContractAttribute plutt que simplement ServiceContract, et lopration est marque avec OperationContractAttribute plutt que OperationContract. En fait, tous les attributs ont le suffixe Attribute avec leur nom. Le compilateur C# reconnat cette convention de noms, et par consquent il vous autorise omettre le suffixe Attribute dans votre propre code.
6. Affichez le formulaire ClientProduit.xaml dans la fentre Concepteur. Faites un double clic sur le bouton Calculer le cot pour gnrer la mthode de gestionnaire dvnement calculerCout_Click de ce bouton. 7. Dans la fentre Code, ajoutez les instructions using suivantes la liste en haut du fichier ClientProduit.xaml.cs :
using ClientProduit.ServiceInformationsProduit; using System.ServiceModel;
Cette instruction cre une instance de la classe InformationsProduitClient que votre code utilisera pour appeler la mthode Web CombienCaCoutera. 9. Ajoutez le code en gras la mthode calculerCout_Click. Ce code extrait lID produit et le nombre requis de la zone de texte Combien du formulaire, excute la mthode Web CombienCaCoutera en utilisant lobjet proxy, puis affiche le rsultat dans le label coutTotal.
private void calculerCout_Click(object sender, RoutedEventArgs e) { InformationsProduitClient proxy = new InformationsProduitClient(); try { int idProd = Int32.Parse(idProduit.Text); int nombreRequis = Int32.Parse(combien.Text); decimal cout = proxy.CombienCaCoutera(idProd, nombreRequis); coutTotal.Content = String.Format("{0:C}", cout); } catch (Exception ex) { MessageBox.Show("Erreur en calculant le cot: " + ex.Message, "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); } finally { if (proxy.State == CommunicationState.Faulted) proxy.Abort(); else proxy.Close(); } }
Vous savez probablement combien les rseaux sont imprvisibles, et ceci est valable deux fois plus pour Internet. Le bloc try/catch assure que lapplication cliente intercepte toutes les exceptions rseau qui peuvent survenir. Il est galement possible que lutilisateur puisse ne pas saisir un entier valide dans la zone de texte ID Produit du formulaire. Le bloc try/catch gre aussi cette exception. Le bloc finally examine ltat de lobjet proxy. Si une exception est apparue dans le service Web (qui peut tre provoque par lutilisateur fournissant un ID produit inexistant, par exemple), le proxy
sera ltat Faulted. Dans ce cas, le bloc finally appelle la mthode Abort du proxy pour reconnatre lexception et fermer la connexion ; dans le cas contraire, il appelle la mthode Close. Les mthodes Abort et Close ferment toutes les deux les canaux de communication avec le service Web et librent les ressources associes cette instance de lobjet InformationsClientProduit.
Test de lapplication
1. Dans le menu Dboguer, cliquez sur Dmarrer sans dbogage. 2. Lorsque le formulaire Dtails du produit apparat, saisissez 3 dans la zone de texte ID Produit, saisissez 5 dans la zone de texte Combien, puis cliquez sur Calculer le cot. Aprs un court dlai pendant que le client instancie le proxy et gnre une demande SOAP contenant lID produit, le proxy envoie la demande au service Web. Le service Web dsrialise la demande SOAP pour extraire lID produit, lit le prix unitaire du produit dans la base de donnes, calcule le cot total, lencapsule en XML dans un message de rponse SOAP, puis renvoie ce message de rponse au proxy. Le proxy dsrialise les donnes XML puis les transmet au code de la mthode calculerCout_Click. Le cot pour 5 units du produit 3 apparat dans le formulaire (50).
Astuce Si vous obtenez une exception avec le message Erreur en calculant le cot : Il nexistait pas de point de terminaison lcoute sur http://localhost:4500/ServiceInformationsProduit/Service.svc pouvant accepter le message , le serveur de dveloppement a probablement arrt son excution (il sarrte sil est inactif pendant un moment). Pour le redmarrer, basculez vers linstance Visual Studio 2010 du service Web InformationsProduit, faites un clic droit sur Service.svc dans lExplorateur de solutions, puis cliquez sur Afficher dans le navigateur. Fermez Internet Explorer lorsquil apparat.
3. Faites des tests en saisissant les ID dautres produits. Notez que si vous entrez un ID dun produit qui nexiste pas, le service Web retourne la valeur 0 pour le cot total. 4. Lorsque vous avez fini, fermez le formulaire et retournez dans Visual Dunod 2010 Visual C#2010 tape par tape John Sharp
Studio.
Chapitre 29 Cration et utilisation dun service Web 1.4. Dans la zone de texte Nom, saisissez ContratsDetailsProduit. 1.5. Dans la zone de texte Emplacement, spcifiez le dossier \Visual C Sharp Etape par tape\Chapitre 29 de votre dossier Documents. 1.6. Cliquez sur OK. 2. Si vous utilisez Microsoft Visual C# 2010 Express, effectuez les tches suivantes pour crer un nouveau projet de bibliothque de classes : 2.1. Dmarrez Visual C# 2010 Express sil nest pas dj ouvert. 2.2. Dans le menu Fichier, cliquez sur Nouveau projet. 2.3. Dans la bote de dialogue Nouveau projet, dans le volet du milieu, slectionnez le modle Bibliothque de classes. 2.4. Dans la zone de texte Nom, saisissez ContratsDetailsProduit. 2.5. Cliquez sur OK. 2.6. Dans le menu Fichier, cliquez sur Enregistrer ContratsDetailsProduit. 2.7. Dans la bote de dialogue Enregistrer le projet, dans la zone de texte Emplacement, spcifiez le dossier \Visual C Sharp Etape par tape\Chapitre 29 de votre dossier Documents. 2.8. Cliquez sur Enregistrer. 3. Dans le menu Projet, cliquez sur Ajouter une rfrence. 4. Dans la bote de dialogue Ajouter une rfrence, cliquez sur longlet .NET. Slectionnez les assemblys System.Data.Linq, System.ServiceModel, System.ServiceModel.Web, et System.Runtime.Serialization puis cliquez sur OK. 5. Dans lExplorateur de solutions, faites un clic droit sur le fichier Class1.cs puis cliquez sur Renommer. Modifier le nom du fichier Produit.cs. Autorisez Visual Studio modifier toutes les rfrences de Class1 Produit lorsque cela apparat. 6. Faites un double clic sur le fichier Produit.cs pour lafficher dans la fentre Code sil nest pas dj ouvert. 7. Dans le fichier Produit.cs, ajoutez les instructions using suivantes la
liste en haut :
using System.Runtime.Serialization; using System.Data.Linq.Mapping;
8. Prfixez la classe Produit avec les attributs Table et DataContract, illustrs en gras :
[Table (Name="Products")] [DataContract] public class Produit { }
Vous allez utiliser LINQ to SQL pour rcuprer les donnes de la base de donnes Northwind. Souvenez-vous (voir le chapitre 25) que lattribut Table marque la classe comme une classe Entity. La table est appele Products dans la base de donnes Northwind. 9. Ajoutez les proprits en gras la classe Produit. Assurez-vous de prfixer chaque proprit avec les attributs Column et DataMember. Notez que certaines de ces proprits sont nullable.
[DataContract] public class Produit { [Column] [DataMember] public int ProductID { get; set; } [Column] [DataMember] public string ProductName { get; set; } [Column] [DataMember] public int? SupplierID { get; set; } [Column] [DataMember] public int? CategoryID { get; set; } [Column] [DataMember] public string QuantityPerUnit { get; set; } [Column] [DataMember]
4. Modifiez la classe IDetailsProduit en une interface publique, et prfixez-la avec lattribut ServiceContract, comme indiqu ici en gras :
[ServiceContract] public interface IDetailsProduit { }
La mthode TrouverProduit prend un ID produit et retourne un objet Produit pour le produit qui possde cet ID. Lattribut OperationContract indique que cette mthode doit tre expose comme une mthode Web (si vous omettez lattribut OperationContract, la mthode nest pas accessible aux applications clientes). Lattribut WebGet indique que cest une opration de recherche logique, et le paramtre UriTemplate spcifie le format de lURL que vous fournissez pour appeler cette opration, relative ladresse de base du service Web. Dans ce cas, vous pouvez spcifier lURL suivante pour rechercher le produit avec idProduit 7 :
http://host/service/produits/7
Les termes host et service reprsentent ladresse de votre serveur Web et le nom du service Web. Llment de UriTemplate entre accolades indique que les donnes sont transmises comme paramtre la mthode TrouverProduit. Lidentificateur entre accolades doit correspondre au nom du paramtre. 6. Dans le menu Gnrer, Cliquez sur Gnrer la solution et vrifiez que la bibliothque de classes se compile sans erreur. Le projet cre un assembly appel ContratsDetailsProduit.dll. Maintenant que vous avez gnr un assembly qui dfinit le contrat de donnes et le contrat de service du service Web, vous pouvez gnrer le service Web lui-mme.
Important Nutilisez pas linstance que vous avez utilise pour crer le service Web SOAP car cette copie de Visual Studio doit continuer de tourner pour garder le serveur Web de dveloppement hbergeant le service Web SOAP ouvert.
2. Si vous utilisez Visual Studio 2010, dans le menu Fichier, pointez Nouveau, puis cliquez sur Site Web. 3. Si vous utilisez Visual Web Developer 2010 Express, dans le menu Fichier, cliquez sur Nouveau site Web. 4. Dans la bote de dialogue Nouveau site Web, cliquez sur le modle Service WCF. Slectionnez Systme de fichiers dans la zone de liste droulante Emplacement, et spcifiez le dossier \Visual C Sharp Etape par tape\Chapitre 29\DetailsProduitService de votre dossier Documents puis cliquez sur OK. 5. Cliquez sur le projet C:\...\DetailsProduitService\. Dans la fentre Proprits, initialisez la proprit Utiliser des ports dynamiques False et la proprit Numro de port 4600.
Note Il est important de spcifier un port diffrent du service Web ServiceInformationsProduit ; sinon, les deux services Web entreront en conflit.
6. Dans le menu Site Web, cliquez sur Ajouter une rfrence. Dans la bote de dialogue Ajouter une rfrence, cliquez sur longlet Parcourir. Dans la barre doutils, cliquez sur le bouton Dossier parent, allez dans le dossier ContratsDetailsProduit\ContratsDetailsProduit\bin\Debug, slectionnez lassembly ContratsDetailsProduit.dll, puis cliquez sur OK. 7. Dans lExplorateur de solutions, dveloppez le dossier App_Code sil nest pas dj ouvert, faites un clic droit sur le fichier Service.cs, puis cliquez sur Renommer. Modifiez le nom du fichier en DetailsProduit.cs. 8. Dans le dossier App_Code, supprimez le fichier IService.cs. Ce fichier nest pas ncessaire au service Web. 9. Faites un double clic sur le fichier DetailsProduit.cs pour lafficher dans la fentre Code. 10. Ajoutez les instructions using suivantes la liste en haut du fichier :
11. Modifiez la dfinition de la classe Service, modifiez le nom en DetailsProduit, et spcifiez quelle implmente linterface IDetailsProduit, comme indiqu ici en gras. Supprimez les mthodes GetData et GetDataUsingDataContract de la classe DetailsProduit :
public class DetailsProduit : IDetailsProduit { }
LID produit est transmis la mthode comme une chane, si bien que la premire instruction la convertit en entier et stocke le rsultat dans la variable ID. Le code cre alors un objet DataContext qui se connecte la base de donnes Northwind. La requte LINQ recherche toutes les lignes qui ont un ID produit qui correspond la valeur de la variable ID. Il doit y avoir au moins un produit correspondant. Habituellement, vous devez parcourir les rsultats dune requte LINQ to SQL pour rcuprer chaque ligne tour tour, mais sil ny a quune Dunod 2010 Visual C#2010 tape par tape John Sharp
seule ligne vous pouvez utiliser la mthode dextension First pour rcuprer les donnes immdiatement. Lobjet Produit rcupr par la requte est retourn comme rsultat de la mthode. La prochaine tape consiste configurer le service Web REST pour fournir la chane de connexion que lassembly ContratsDetailsProduit utilise pour se connecter la base de donnes, puis spcifier le protocole et le point de terminaison que les applications clientes peuvent utiliser pour communiquer avec le service Web.
to false and remove the metadata endpoint above before deployment --> <serviceMetadata httpGetEnabled="true"/> <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Ce service Web utilise une liaison diffrente du service Web InformationsProduit Web (webHttpBinding). La liaison webHttpBinding et le comportement WebBehavior indiquent que le service Web attend que les requtes soient envoyes en suivant le style REST, encodes dans lURL, et doit retourner les messages de rponses au format POX (XML plein). 3. Dans lExplorateur de solutions, faites un double clic sur le fichier Service.svc pour lafficher dans la fentre Code. Mettez jour les lments Service et CodeBehind pour faire rfrence la classe DetailsProduits du fichier DetailsProduit.cs, comme ici en gras :
<%@ ServiceHost Language="C#" Debug="true" Service="DetailsProduit" CodeBehind="~/App_Code/DetailsProduit.cs" %>
4. Dans le menu Gnrer, cliquez sur Gnrer le site Web. 5. Dans lExplorateur de solutions, faites un clic droit sur Service.svc, puis cliquez sur Afficher dans le navigateur. Internet Explorer apparat affichant la page du service DetailsProduit. 6. Dans la barre dadresse, spcifiez lURL suivante et appuyez sur la touche Entre :
http://localhost:4600/DetailsProduitService/Service.svc/produits/5
Cette URL appelle la mthode TrouverProduit du service Web DetailsProduit et spcifie le produit 5. La mthode TrouverProduit recherche les donnes du produit 5 de la base donnes Northwind et retourne les informations sous la forme dun objet Produit, srialis en XML. Internet Explorer doit afficher la reprsentation XML de ce produit.
la barre doutils, cliquez sur Dossier parent deux fois, allez dans le dossier ContratsDetailsProduit\ContratsDetailsProduit\bin\Debug, slectionnez lassembly ContratsDetailsProduit, puis cliquez sur OK. 4. Dans le menu Projet, cliquez nouveau sur Ajouter une rfrence. Dans la bote de dialogue Ajouter une rfrence, cliquez sur longlet .NET. Slectionnez lassembly System.Data.Linq, puis cliquez sur OK. 5. Dans le menu Projet, cliquez sur Ajouter une classe. Dans la bote de dialogue Ajouter un nouvel lment ClientProduit, dans le volet du milieu, cliquez sur le modle Classe. Dans la zone de texte Nom, saisissez ProxyClientProduit.cs, puis cliquez sur Ajouter. 6. Dans la fentre Code affichant le fichier ProxyClientProduit.cs, ajoutez les instructions using suivantes la liste en haut du fichier :
using System.ServiceModel; using ContratsDetailsProduit;
7. Modifiez la dfinition de la classe ProxyClientProduit de manire ce quelle hrite de la classe gnrique ClientBase et implmente linterface IDetailsProduit. Spcifiez linterface IDetailsProduit comme paramtre de type de la classe ClientBase. La classe ProxyClientProduit doit ressembler ceci :
class ProxyClientProduit : ClientBase<IDetailsProduit>, IDetailsProduit { }
8. Ajoutez la mthode TrouverProduit en gras la classe ProxyClientProduit. Cette mthode suit le mme schma que celui utilis par le proxy SOAP illustr plus haut dans ce chapitre ; il transmet la demande du client au canal de communication.
class ProxyClientProduit : ClientBase<IDetailsProduit>, IDetailsProduit { public Produit TrouverProduit(string idProduit) { return this.Channel.TrouverProduit(idProduit); } }
9. Affichez le fichier ClientProduit.xaml dans la fentre Concepteur. 10. Faites un double clic sur le bouton Trouver le produit pour gnrer la
mthode du gestionnaire dvnement trouverProduit_Click de ce bouton. 11. Dans la fentre Code, ajoutez les instructions using suivantes la liste en haut du fichier ClientProduit.xaml.cs :
using ContratsDetailsProduit;
Ce code cre une instance de la classe ProxyClientProduit et lutilise pour appeler la mthode TrouverProduit du service Web REST. Les Dunod 2010 Visual C#2010 tape par tape John Sharp
donnes de lobjet Produit retourne sont affiches dans les contrles label du formulaire. 13. Dans lExplorateur de solutions, faites un double clic sur le fichier app.config. Cest le fichier de configuration de lapplication. Il a t gnr automatiquement lorsque vous avez cr le proxy du service Web SOAP dans un exercice prcdent. Il contient un lment <system.serviceModel> qui dcrit le point de terminaison du service Web SOAP, notamment lURL laquelle lapplication doit se connecter. 14. Recherchez llment <client>, et ajoutez llment <endpoint> en gras la section existante <endpoint> :
<client> <endpoint address="http://localhost:4600/DetailsProduitService/Service.svc" binding="webHttpBinding" contract="ContratsDetailsProduit.IDetailsProduit" behaviorConfiguration="WebBehavior"> </endpoint> <endpoint address="http://localhost:4500/ServiceInformationsProduit/Service.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IInformationsProduit" contract="ServiceInformationsProduit.IInformationsProduit" name="WSHttpBinding_IInformationsProduit"> <identity> <userPrincipalName value="VotreOrdinateur\VotreNom" /> </identity> </endpoint> </client>
client point de terminaison. Il spcifie que le client doit se connecter au service Web en utilisant le comportement webHttp attendu par le service Web REST. 16. Dans le menu Dboguer, cliquez sur Dmarrer sans dbogage. 17. Lorsque le formulaire Dtails du produit apparat, dans la zone de texte ID Produit, saisissez 10 ; dans la zone de texte Combien, saisissez 5 ; puis cliquez sur Calculer le cot. Le cot total doit tre affich (155). Cela permet de vrifier si le service Web SOAP fonctionne toujours. 18. Cliquez sur Trouver le produit. Les dtails pour Ikura doivent apparatre dans les tiquettes du formulaire, comme dans la figure suivante :
19. Testez avec dautres ID produit. Notez que si vous spcifiez un ID produit qui nexiste pas, le service Web retourne une exception Bad Request . 20. Fermez le formulaire Dtails du produit lorsque vous avez termin. Dans ce chapitre, vous avez vu comment utiliser Visual Studio pour concevoir deux styles diffrents de service Web : SOAP et REST. Vous avez galement vu comment concevoir des applications clientes qui peuvent utiliser ces styles de service Web. Vous avez galement termin tous les exercices de ce livre. Vous devez maintenant connatre trs bien le langage C# et comprendre comment utiliser Visual Studio 2010 pour gnrer des applications professionnelles. Cependant, ce nest pas la fin de lhistoire. Vous avez saut la premire haie, mais les meilleurs programmeurs C# apprennent en pratiquant, et vous pouvez acqurir cette exprience uniquement en gnrant des apDunod 2010 Visual C#2010 tape par tape John Sharp
plications C#. Vous allez ainsi dcouvrir de nouvelles faons dutiliser le langage C# et de nombreuses fonctionnalits disponibles dans Visual Studio 2010 que je nai pas eu la place de traiter dans ce livre. Noubliez pas galement que C# est un langage qui volue. En 2001, lorsque nous avons crit la premire dition de ce livre, C# prsentait une syntaxe et une smantique permettant de gnrer des applications qui utilisaient le .NET Framework 1.0. Certaines amliorations ont t ajoutes Visual Studio et au .NET Framework 1.1 en 2003, puis en 2005, C# 2.0 est apparu et prenait en charge les gnriques et le .NET Framework 2.0. C# 3.0 a ajout de nombreuses fonctionnalits telles que les types anonymes, les expressions lambda, et la plus significative, LINQ. Et maintenant C# 4.0 a tendu le langage encore plus avec la prise en charge des arguments nomms, des paramtres optionnels, des interfaces contra et covariant, et lintgration avec des langages dynamiques. La prochaine version de C# nous rservera sans doute dautres surprises
Aide-mmoire du chapitre 29
Pour
Crer un service Web SOAP
Accomplissez
Utilisez le modle Service WCF. Dfinissez un contrat de service qui spcifie les mthodes Web exposes par le service Web en crant une interface avec lattribut ServiceContract. Marquez chaque mthode avec lattribut OperationContract. Crez une classe qui implmente cette interface. Configurez le service pour utiliser la liaison wsHttpBinding.
Utilisez le modle Service WCF. Dfinissez un contrat de service qui spcifie les mthodes Web exposes par le service Web en crant une interface avec lattribut ServiceContract. Balisez chaque mthode avec lattribut OperationContract et lattribut WebGet, qui spcifie le modle URI pour appeler la mthode. Crez une classe qui implmente cette interface. Configurez le service pour utiliser la liaison webHttpBinding, et spcifiez le comportement webHttp pour le point de terminaison du service.
Pour
Afficher la description dun service Web SOAP
Accomplissez
Faites un clic droit sur le fichier .svc dans lExplorateur de solutions, et cliquez sur Afficher dans le navigateur. Internet Explorer sexcute, va sur ladresse du service Web, et affiche une page dcrivant comment crer une application cliente pouvant accder au service Web. Cliquez sur le lien WSDL pour afficher la description WSDL du service Web. Dfinissez une classe pour contenir les donnes, et balisez-la avec lattribut DataContract. Assurez-vous que chaque lment des donnes est accessible soit comme champ public soit via une proprit publique qui fournit les accs get et set. Assurez-vous que la classe possde un constructeur par dfaut (qui peut tre vide). Dans le menu Projet, cliquez sur Ajouter une rfrence de service. Saisissez lURL du service Web dans la zone de texte Adresse en haut de la bote de dialogue, puis cliquez sur Aller . Spcifiez lespace de noms de la classe proxy, puis cliquez sur OK. Crez une classe qui hrite de la classe gnrique ClientBase, et spcifie linterface qui dfinit le contrat de service en tant que paramtre de type. Implmentez cette interface, et utilisez la proprit Channel hrite de la classe ClientBase pour envoyer des demandes au service Web. Crez une instance de la classe proxy. Appelez la mthode Web en utilisant la classe proxy.
Transmettre des donnes complexes en tant que mthode Web et retourner des valeurs Crer une classe proxy dun service Web SOAP dans une application cliente Crer une classe proxy dun service Web REST dans une application cliente