Advanced Web Programming
Cet exemple illustre quelques-unes des fonctions avancées du modèle de programmation Web Windows Communication Foundation (WCF). L'exemple présente les concepts suivants :
- Distribution de modèles URI : permet aux opérations de service d'être liées aux URI externes qui correspondent à un modèle particulier.
- Méthodes HTTP : les opérations de service peuvent être appelées par des méthodes HTTP arbitraires, y compris GET, PUT, POST et DELETE.
- En-têtes HTTP : les services peuvent manipuler le contenu d'en-têtes HTTP à l'aide de WebOperationContext.
Remarque : |
---|
Cet exemple requiert l'installation de .NET Framework version 3.5 pour être généré et exécuté. Visual Studio 2008 est nécessaire pour l'ouverture des fichiers projet et solution. |
L'exemple implémente une collection simple de données client stockée en mémoire. Il prend en charge les opérations de base Create
, Read
, Update
et Delete
exposées en externe à l'aide d'URI et de méthodes HTTP.
Contrat et implémentation de service
Dans cet exemple, le service implémente un point de terminaison unique qui écoute sur une adresse URI de base (https://localhost:8000/Customers). Le service gère des requêtes pour les URI sous ce préfixe comme suit :
- Les requêtes GET à https://localhost:8000/Customers sont acheminées vers
GetCustomers()
. - Chaque client possède un identificateur unique dans le système, contenu dans l'URI. Les requêtes GET pour ces URI (par exemple, https://localhost:8000/Customers/1) sont mappées à
GetCustomer()
. - Les différents clients peuvent être mis à jour par l'émission d'une requête HTTP PUT à l'URI du client.
- Un client peut être supprimé du système par l'émission d'une requête HTTP DELETE à l'URI du client.
- De nouvelles données peuvent être ajoutées au système par l'émission d'une requête HTTP POST à l'URI de base.
[ServiceContract]
public interface ICustomerCollection
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "")]
Customer AddCustomer(Customer customer);
[OperationContract]
[WebInvoke(Method = "DELETE", UriTemplate = "{id}")]
void DeleteCustomer(string id);
[OperationContract]
[WebGet(UriTemplate = "{id}")]
Customer GetCustomer(string id);
[OperationContract]
[WebGet(UriTemplate = "")]
List<Customer> GetCustomers();
[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "{id}")]
Customer UpdateCustomer(string id, Customer newCustomer);
}
Le contrat de service est implémenté par la classe Service
, qui utilise l'instanciation singleton WCF. Toutes les requêtes reçues sont acheminées vers la même instance d'objet sur le serveur, ce qui permet le partage de la table de hachage du client entre les requêtes.
[ServiceBehavior( InstanceContextMode = InstanceContextMode.Single )]
public class Service : ICustomerCollection
{
Hashtable customers = new Hashtable();
...
}
L'opération GetCustomers()
peut être appelée par l'émission d'une requête HTTP GET à l'URI de base du service (par exemple, https://localhost:8000/Customers). Le type Customer
est sérialisé avec le Data Contract Serializer.
public List<Customer> GetCustomers()
{
List<Customer> list = new List<Customer>();
foreach (Customer c in this.customers.Values)
{
list.Add(c);
}
return list;
}
Les différents clients peuvent être extraits par l'émission d'une requête GET à l'URI unique du client. Par exemple, le client doté de l'ID 1 peut être extrait à https://localhost:8000/Customers/1. De la même façon, il est possible d'accéder au client 2 à http:/localhost:8000/Customers/2. Les deux URI sont distribués à la méthode GetCustomer(string id)
sur le serveur. Ce mappage est créé par l'attribut [WebGet( UriTemplate="{id}")]
qui s'applique au contrat d'opération GetCustomer()
. UriTemplate est un modèle qui décrit le jeu d'URI que gère l'opération GetCustomer()
. Dans ce cas, le modèle décrit tous les URI qui ont exactement un segment qui suit l'adresse de base du point de terminaison. Le contenu de ce segment est comparé à la variable du modèle {id}
et transmis par le répartiteur WCF au paramètre de méthode id
.
//[WebGet( UriTemplate=”{id}” )]
public Customer GetCustomer(string id)
{
Customer c = this.customers[id] as Customer;
if (c == null)
{
WebOperationContext.Current.OutgoingResponse.SetStatusAsNotFound();
return null;
}
return c;
}
L'implémentation de GetCustomer()
recherche l'ID client (fourni dans l'URI) et retourne le client associé. Si aucun client n'est trouvé, l'opération retourne une réponse HTTP 404 en utilisant la méthode WebOperationContext pour définir le code de l'état de la réponse.
Notez que les méthodes UpdateCustomer()
et DeleteCustomer()
sont également associées au même modèle d'URI que la méthode GetCustomer()
. Le modèle de programmation Web WCF autorise la liaison de plusieurs opérations au même modèle d'URI dans la mesure où chacune d'elles est associée à une méthode HTTP différente. Dans ce cas, la méthode UpdateCustomer()
est liée à la méthode HTTP PUT, alors que l'opération DeleteCustomer()
est liée à la méthode HTTP DELETE.
[OperationContract]
[WebInvoke( Method="PUT", UriTemplate="{id}")]
Customer UpdateCustomer(string id, Customer newCustomer);
[OperationContract]
[WebInvoke( Method="DELETE", UriTemplate="{id}" )]
void DeleteCustomer(string id);
La méthode AddCustomer()
indique comment utiliser la nouvelle classe UriTemplate pour créer de nouveaux URI qui suivent un modèle spécifique. La méthode WebOperationContext()
est utilisée pour retourner une réponse HTTP CREATED avec l'en-tête location défini sur l'URI du client récemment créé.
public Customer AddCustomer(Customer customer)
{
lock (writeLock)
{
counter++;
UriTemplateMatch match = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;
UriTemplate template = new UriTemplate("{id}");
customer.Uri = template.BindByPosition(match.BaseUri, counter.ToString());
customers[counter.ToString()] = customer;
WebOperationContext.Current.OutgoingResponse.SetStatusAsCreated(customer.Uri);
}
return customer;
}
Hébergement du service
Le service est hébergé à l'aide de WebServiceHost()
, et un point de terminaison est exposé à l'aide de WebHttpBinding()
.
using (WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("https://localhost:8000/Customers")))
{
//WebServiceHost will automatically create a default endpoint at the base address using the WebHttpBinding
//and the WebHttpBehavior, so there's no need to set it up explicitly
host.Open();
...
}
Client
Le client est créé à l'aide de la méthode WebChannelFactory
pour créer un canal vers le service distant.
using (WebChannelFactory<ICustomerCollection> cf = new WebChannelFactory<ICustomerCollection>( baseAddress ))
{
//WebChannelFactory will default to using the WebHttpBinding with the WebHttpBehavior,
//so there's no need to set up the endpoint explicitly
ICustomerCollection channel = cf.CreateChannel();
...
}
Le client qui utilise le canal émet une série de requêtes au serveur qui manipule l'état de la collection de clients.
Sortie
Ajout de clients avec la requête POST :
Alice 123 Pike Place https://localhost:8000/Customers/1
Bob 2323 Lake Shore Drive https://localhost:8000/Customers/2
Utilisation de la requête PUT pour mettre à jour un client :
Charlie 123 Pike Place https://localhost:8000/Customers/1
Utilisation de la requête GET pour extraire la liste de clients :
Charlie 123 Pike Place https://localhost:8000/Customers/1
Bob 2323 Lake Shore Drive https://localhost:8000/Customers/2
Utilisation de la requête DELETE pour supprimer un client :
Liste définitive des clients :
Charlie 123 Pike Place https://localhost:8000/Customers/1
Une fois l'interaction terminée, le programme attend que vous appuyiez sur une touche puis se ferme.
Pour configurer, générer et exécuter l'exemple
Assurez-vous d'avoir effectué la procédure indiquée dans la section Procédure d'installation unique pour les exemples Windows Communication Foundation.
Pour générer l'édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Génération des exemples Windows Communication Foundation.
Pour exécuter l'exemple dans une configuration à un ou plusieurs ordinateurs, suivez les instructions indiquées dans Exécution des exemples Windows Communication Foundation.
Voir aussi
Tâches
Basic Web Programming Model, exemple
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.