Partager via


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.
Bb472541.note(fr-fr,VS.90).gifRemarque :
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

  1. Assurez-vous d'avoir effectué la procédure indiquée dans la section Procédure d'installation unique pour les exemples Windows Communication Foundation.

  2. 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.

  3. 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.