Upload
others
View
11
Download
3
Embed Size (px)
Citation preview
C# : WCF
Achref El Mouelhi
Docteur de l’universite d’Aix-MarseilleChercheur en programmation par contrainte (IA)
Ingenieur en genie logiciel
H & H: Research and Training 1 / 41
Plan
1 Introduction
2 Premier service Somme
3 Creation d’un client d’un service WCF
4 Limiter l’acces au modele avec les services
5 Rendre un service WCF RESTFUL
H & H: Research and Training 2 / 41
Introduction
WCF
WCF : Windows Communication Foundation
infrastructure pour la creation d’applications orientees service
permettant de creer des composants (service web) independantssans se soucier de la configuration (WSDL...)
permettant aussi de limiter l’exposition de donnees
pouvant etre implementees en utilisant n’importe quel langage de.NET Framework (C#, F#, VB.NET...)
H & H: Research and Training 3 / 41
Introduction
WCF
Un premier projet WCF
Dans le menu Fichier, aller dans Nouveau > Projet
Dans Visual C#, cliquer sur WCF et selectionner Applicationde service WCF
Saisir un nom pour le projet et un pour la solution et valider
H & H: Research and Training 4 / 41
Introduction
WCF
Remarques
Pas de Program.cs dans le projet, ni la methode principaleMain
Presence de deux fichiers Service1.svc et IService1.cs
H & H: Research and Training 5 / 41
Introduction
WCF
Contenu de l’interface IService1
[ServiceContract]public interface IService1{
[OperationContract]string GetData(int value);
[OperationContract]CompositeType GetDataUsingDataContract(
CompositeType composite);
}
H & H: Research and Training 6 / 41
Introduction
WCFContenu du CompositeType
[DataContract]public class CompositeType{
bool boolValue = true;string stringValue = "Hello ";
[DataMember]public bool BoolValue{
get { return boolValue; }set { boolValue = value; }
}[DataMember]public string StringValue{
get { return stringValue; }set { stringValue = value; }
}}
H & H: Research and Training 7 / 41
Introduction
WCFContenu de la classe Service1 qui implemente IService1
public class Service1 : IService1{
public string GetData(int value){
return string.Format("You entered: {0}", value);}
public CompositeType GetDataUsingDataContract(CompositeTypecomposite)
{if (composite == null){
throw new ArgumentNullException("composite");}if (composite.BoolValue){
composite.StringValue += "Suffix";}return composite;
}}
H & H: Research and Training 8 / 41
Introduction
WCF
Pour tester
Faire un clic sur Service1.svc
Ensuite executer
Un simulateur de client qui s’affiche
Cliquer sur la methode GetData(), saisir une valeur dans valuede la partier requete ensuite cliquer sur Appeler pour recevoirla reponse
Pour avoir plus d’informations sur l’utilisation de notre service,copier l’url, situee dans Mes projets de service, dans unnavigateur web.
H & H: Research and Training 9 / 41
Premier service Somme
WCFOn veut creer une methode qui calcule la somme de deux entiers.Dans l’interface IService1 il faut ajouter
[ServiceContract]public interface IService1{
[OperationContract]int Somme(int a, int b);...
}
Dans la classe Service1, il faut ajouter l’implementation
public int Somme(int value1, int value2){
return value1 + value2;}
Tester
H & H: Research and Training 10 / 41
Premier service Somme
WCFOn veut creer une methode qui calcule la somme de deux entiers.Dans l’interface IService1 il faut ajouter
[ServiceContract]public interface IService1{
[OperationContract]int Somme(int a, int b);...
}
Dans la classe Service1, il faut ajouter l’implementation
public int Somme(int value1, int value2){
return value1 + value2;}
TesterH & H: Research and Training 10 / 41
Creation d’un client d’un service WCF
WCF
Creation d’un nouveau projet
Clic droit sur la solution (dans l’Explorateur de solutions)
Aller dans Ajouter > Nouvel projet
Choisir Application console
Saisir un nom (ClientWCF par exemple) et valider
Faire un clic droit sur le nom du nouveau projet
Cliquer sur Definir comme projet de demarrage
H & H: Research and Training 11 / 41
Creation d’un client d’un service WCF
WCF
Referencer le service dans le nouveau projet
Clic droit sur References du nouveau projet
Choisir Ajouter une reference de service
Cliquer sur Decouvrir
Selectionner le service et valider
H & H: Research and Training 12 / 41
Creation d’un client d’un service WCF
WCFContenu du client
using ClientWCF.ServiceReference1;namespace ConsoleApp1{
class Program{
static void Main(string[] args){
var client = new ServiceReference1.Service1Client();
int a = 7;int b = 3;int result = client.Somme(a, b);Console.WriteLine($"la somme de {a} et {b} est {
result}");Console.ReadKey();client.Close();
}}
}H & H: Research and Training 13 / 41
Limiter l’acces au modele avec les services
WCF
Etapes
Installer Entity Framework en utilisant NuGet
Importer une base de donnees contenant la table personne selonl’approche Code First
Definir le DataContract
Definir le ServiceContract
Implementer le ServiceContract
Utiliser un client pour acceder au modele
H & H: Research and Training 14 / 41
Limiter l’acces au modele avec les services
WCF
Avant de commencer
Supprimer les deux fichiers IService et Service
Faire clic droit sur le nom du projet, aller dans Ajouter >Nouvel element
Dans la zone de recherche, saisir WCF
Selectionner Service WCF
Dans Nom : , saisir PersonneService et garder l’extension
H & H: Research and Training 15 / 41
Limiter l’acces au modele avec les services
WCFDefinir le DataContract dans le fichier IPersonneService
[DataContract]public class PersonneContract{
[DataMember]public string Nom { get; set; }
[DataMember]public string Prenom { get; set; }
[DataMember]public int Age { get; set; }
}
On n’expose pas la cle primaireH & H: Research and Training 16 / 41
Limiter l’acces au modele avec les services
WCF
Definir le ServiceContract
[ServiceContract]public interface IPersonneService{
[OperationContract]List<PersonneContract> GetPersonnes();
}
H & H: Research and Training 17 / 41
Limiter l’acces au modele avec les services
WCFImplementer le ServiceContract dans PersonneService
public class PersonneService : IPersonneService{
public List<PersonneContract> GetPersonnes(){
List<PersonneContract> collection = null;using (var db = new Model1()){
var persoQuery = from perso in db.personnesselect perso;
collection = new List<PersonneContract>(persoQuery.Select(elt => new PersonneContract()
{Prenom = elt.FirstName,Nom = elt.LastName,Age = elt.Age
}));}return collection;
}}
H & H: Research and Training 18 / 41
Limiter l’acces au modele avec les services
WCF
Verifier que la balisage est a jour
Faire un clic droit sur le fichier .svc
Choisir Afficher le balisage
Verifier que son contenu est le suivant : <%@ ServiceHostLanguage="C#" Debug="true"Service="WcfService1.PersonneService"CodeBehind="PersonneService.svc.cs" %>WcfService1 : le nom du projet WCF
H & H: Research and Training 19 / 41
Limiter l’acces au modele avec les services
WCF
Tester
Faire un clic sur PersonneService.svc
Ensuite executer
Cliquer sur la methode GetPersonnes()
Etendre le contenu de la colonne Nom de Reponse
H & H: Research and Training 20 / 41
Limiter l’acces au modele avec les services
WCFPour tester a partir d’un client
namespace ConsoleApp1{
class Program{
static void Main(string[] args){
PersonneServiceClient client = newPersonneServiceClient();
var personnes = client.GetPersonnes();foreach (var elt in personnes)
Console.WriteLine($"Bonjour {elt.Prenom} {elt.Nom}");
Console.ReadKey();client.Close();
}}
}
Referencer le service apres mise a jourH & H: Research and Training 21 / 41
Limiter l’acces au modele avec les services
WCF
Pour faire l’ajout, on prepare la methode AjoutPersonne
[ServiceContract]public interface IPersonneService{
[OperationContract]List<PersonneContract> GetPersonnes();
[OperationContract]bool AjoutPersonne(PersonneContract personne
);
}
H & H: Research and Training 22 / 41
Limiter l’acces au modele avec les services
WCFImplementer le ServiceContract dans PersonneService
public bool AjoutPersonne(PersonneContract personne){
using (var db = new Model1()){
var persoQuery = from perso in db.personneswhere perso.FirstName == personne.Nom&& perso.LastName == personne.Prenomselect perso;
if (persoQuery.Count() > 0)return false;
else{
personne p = new personne(){
FirstName = personne.Prenom,LastName = personne.Nom,Age = personne.Age,
};db.personnes.Add(p);db.SaveChanges();return true;
}}
}H & H: Research and Training 23 / 41
Rendre un service WCF RESTFUL
WCF
Etapes
Ajouter un (ou des) decorateur(s) a notre operation pour preciserla methode HTTP, le type de reponse, l’URL...
Configurer le service pour qu’il devienne accessible
H & H: Research and Training 24 / 41
Rendre un service WCF RESTFUL
WCFPour faire l’ajout, on ajoute le decorateur [WebInvoke] a lamethode GetPersonnes()
[ServiceContract]public interface IPersonneService{
[OperationContract][WebInvoke(Method ="GET", UriTemplate ="/
personnes", ResponseFormat =WebMessageFormat.Xml)]
List<PersonneContract> GetPersonnes();
[OperationContract]bool AjoutPersonne(PersonneContract personne
);}
H & H: Research and Training 25 / 41
Rendre un service WCF RESTFUL
WCF
Explication
Method : permet de preciser la methode HTTP (GET, POST,DELETE, PUT...)
UriTemplate : permet de preciser l’URL permettant l’acces a laressource
ResponseFormat : permet d’indiquer le type de la reponse (ici,c’est Xml, mais on peut aussi choisir Json)
H & H: Research and Training 26 / 41
Rendre un service WCF RESTFUL
WCF
On peut aussi utiliser le decorateur [WebGet]
[ServiceContract]public interface IPersonneService{
[OperationContract][WebGet(UriTemplate ="/personnes",
ResponseFormat =WebMessageFormat.Xml)]List<PersonneContract> GetPersonnes();
[OperationContract]bool AjoutPersonne(PersonneContract personne
);}
Dans ce cas, pas besoin de preciser la methode
H & H: Research and Training 27 / 41
Rendre un service WCF RESTFUL
WCF
Configuration du service
Faire un clic droit sur le projet et choisir Generer
Faire un clic droit sur Web.config et choisir Modifier laconfiguration WCF
Dans le panneau Configuration, faire un clic droit surServices et choisir Nouveau service
Dans le panneau Service: NewServiceType, cliquer sur lebouton a droite en face de Name.
Aller dans bin et cliquer deux fois sur le service.
H & H: Research and Training 28 / 41
Rendre un service WCF RESTFUL
WCF
Configuration du service : definir le comportement du point determinaison
Dans le panneau Configuration, etendre la rubriqueParametres avances et cliquer sur Nouveaucomportement.
Faire un clic droit sur Comportements du point determinaison et choisir Nouvelle configuration decomportement de point de terminaison.
Cliquer sur le bouton Ajouter et ajouter webHttp
Dans la section General, saisir WebBehavior dans la zone desaisie Name
H & H: Research and Training 29 / 41
Rendre un service WCF RESTFUL
WCF
Configuration du service : definir le point de terminaison
Faire un clic droit sur Points de terminaison situe dansServices et choisir Nouveau point de terminaison deservice
Dans Binding, choisir webHttpBinding
Cliquer sur le bouton en face de Contract et aller choisir leservice situe dans bin
De la liste deroulante de BehaviorConfiguration, choisirWebBehavior
Aller dans le menu Fichier et cliquer sur Enregistrer
Pour le message qui s’affiche, cliquer sur Oui pour tout
H & H: Research and Training 30 / 41
Rendre un service WCF RESTFUL
WCF
Pour tester
Executer le projet
Cliquer sur PersonneService.svc
Ajouter la route /personnes (par exemplehttp://localhost:53907/PersonneService.svc/personnes)
H & H: Research and Training 31 / 41
Rendre un service WCF RESTFUL
WCF
Le resultat (en Xml) semblera a :
<ArrayOfPerson xmlns="http://schemas.datacontract.org/2004/07/WcfService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Person><FirstName>Jacques</FirstName><LastName>Ernest</LastName><Age>45</Age>
</Person><Person><FirstName>achref</FirstName><LastName>el mouelhi</LastName><Age>45</Age>
</Person></ArrayOfPerson>
H & H: Research and Training 32 / 41
Rendre un service WCF RESTFUL
WCF
Le resultat (en Json) semblera a :
[{"FirstName":"Jacques","LastName":"Ernest","Age"
:45},{"FirstName":"achref","LastName":"el mouelhi","Age
":45}]
H & H: Research and Training 33 / 41
Rendre un service WCF RESTFUL
WCF
Pour modifier le nom d’une balise, on peut ajouter l’attribut Namedans le decorateur
[DataContract(Name ="Person")]public class PersonneContract{
[DataMember(Name ="LastName")]public string Nom{
get; set;}
H & H: Research and Training 34 / 41
Rendre un service WCF RESTFUL
WCF
Pour modifier l’ordre des balises
[DataMember(Name ="LastName", Order = 2)]public string Nom{
get; set;}
[DataMember(Name = "FirstName", Order = 1)]public string Prenom{
get; set;}
[DataMember(Name = "Age", Order = 3)]public int Age{
get; set;}
H & H: Research and Training 35 / 41
Rendre un service WCF RESTFUL
WCF
Pour recuperer une seule personne selon son identifiant, il fautajouter dans l’interface le code suivant
[OperationContract][WebGet(UriTemplate = "/personne/{id}",
ResponseFormat = WebMessageFormat.Xml)]PersonneContract GetPersonne(string id);
H & H: Research and Training 36 / 41
Rendre un service WCF RESTFUL
WCFEnsuite il faut implementer la methode
public PersonneContract GetPersonne(string id){
int i = 0;int.TryParse(id, out i);PersonneContract personne = null;using (var db = new Model1()){
var persoQuery = from perso in db.personneswhere perso.ID == iselect perso;
personne = persoQuery.Select(elt => newPersonneContract()
{Prenom = elt.FirstName,Nom = elt.LastName,Age = elt.Age
}).First();}return personne;
}
H & H: Research and Training 37 / 41
Rendre un service WCF RESTFUL
WCF
Pour tester
il faut aller sur la route /personne/2
H & H: Research and Training 38 / 41
Rendre un service WCF RESTFUL
WCF
Pour que ces services soient exploitables par Angular, il fautqu’elles retournent un Observable et que le format de reponsesoit Json
[OperationContract][WebGet(UriTemplate = "/personne/{id}",
ResponseFormat = WebMessageFormat.Json)]ObservableCollection<PersonneContract>
GetPersonne(string id);
H & H: Research and Training 39 / 41
Rendre un service WCF RESTFUL
WCFEnsuite il faut implementer la methode
public ObservableCollection<PersonneContract> GetPersonne(string id)
{int i = 0;int.TryParse(id, out i);ObservableCollection<PersonneContract> personne = null;using (var db = new Model1()){
var persoQuery = from perso in db.personneswhere perso.ID == iselect perso;
personne = new ObservableCollection<PersonneContract>(persoQuery.Select(elt => new PersonneContract()
{Prenom = elt.FirstName,Nom = elt.LastName,Age = elt.Age
}));}return personne;
}
H & H: Research and Training 40 / 41
Rendre un service WCF RESTFUL
WCF
ExerciceAppeler ces methodes a partir d’Angular en utilisant les methodesHTTP dans les services.
Pour pouvoir tester
installer le plugin
(Allow-Control-Allow-Origin : *) sous chromehttps://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi
(CORS Everywhere) sous firefoxhttps://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/
H & H: Research and Training 41 / 41