Partager via


Interopérabilité avec les applications POX

Les applications POX (Plain Old XML) communiquent en échangeant des messages HTTP bruts qui contiennent uniquement des données d’application XML qui ne sont pas placées dans une enveloppe SOAP. Windows Communication Foundation (WCF) peut fournir à la fois des services et des clients qui utilisent des messages POX. Sur le service, WCF peut être utilisé pour implémenter des services qui exposent des points de terminaison à des clients tels que des navigateurs web et des langages de script qui envoient et reçoivent des messages POX. Sur le client, le modèle de programmation WCF peut être utilisé pour implémenter des clients qui communiquent avec les services POX.

Remarque

Ce document a été écrit à l’origine pour .NET Framework 3.0. .NET Framework 3.5 dispose d'un support intégré pour les applications POX. Pour plus d’informations sur le modèle de programmation HTTP web WCF.

Programmation POX avec WCF

Les services WCF qui communiquent via HTTP à l’aide de messages POX utilisent un <customBinding>.

<customBinding>
   <binding name="poxServerBinding">
       <textMessageEncoding messageVersion="None" />
       <httpTransport />
   </binding>
</customBinding>

Cette liaison personnalisée contient deux éléments :

L’encodeur de message texte WCF standard est spécialement configuré pour utiliser la None valeur, ce qui lui permet de traiter les charges utiles de message XML qui n’arrivent pas encapsulées dans une enveloppe SOAP.

Les clients WCF qui communiquent via HTTP à l’aide de messages POX utilisent une liaison similaire (illustrée dans le code impératif suivant).

private static Binding CreatePoxBinding()
{
    TextMessageEncodingBindingElement encoder =
        new TextMessageEncodingBindingElement( MessageVersion.None, Encoding.UTF8 );
    HttpTransportBindingElement transport = new HttpTransportBindingElement();
    transport.ManualAddressing = true;
    return new CustomBinding( new BindingElement[] { encoder, transport } );
}

Étant donné que les clients POX doivent spécifier explicitement les URI auxquels ils envoient des messages, ils doivent généralement configurer le mode d’adressage manuel du HttpTransportBindingElement en définissant la propriété ManualAddressing sur l’élément true. Cela permet aux messages d’être traités explicitement par le code de l’application et il n’est pas nécessaire de créer un message ChannelFactory chaque fois qu’une application envoie un message à un AUTRE URI HTTP.

Étant donné que les messages POX n’utilisent pas d’en-têtes SOAP pour transmettre des informations de protocole importantes, les clients et services POX doivent souvent manipuler des éléments de la requête HTTP sous-jacente utilisée pour envoyer ou recevoir un message. Les informations de protocole spécifiques à HTTP, telles que les en-têtes HTTP et les codes d’état, sont exposées dans le modèle de programmation WCF via deux classes :

  • HttpRequestMessageProperty, qui contient des informations sur la requête HTTP, telles que la méthode HTTP et les en-têtes de requête.

  • HttpResponseMessageProperty, qui contient des informations sur la réponse HTTP, telles que le code d’état HTTP et la description de l’état, ainsi que les en-têtes de réponse HTTP.

L’exemple de code suivant montre comment créer un message de requête HTTP GET adressé à http://localhost:8100/customers.

Message request = Message.CreateMessage( MessageVersion.None, String.Empty );
request.Headers.To = "http://localhost:8100/customers";

HttpRequestMessageProperty property = new HttpRequestMessageProperty();
property.Method = "GET";
property.SuppressEntityBody = true;
request.Properties.Add( HttpRequestMessageProperty.Name, property );

Tout d’abord, une requête Message vide est créée en appelant CreateMessage(MessageVersion, String). Le None paramètre est utilisé pour indiquer qu’une enveloppe SOAP n’est pas obligatoire et Empty que le paramètre est passé en tant qu’action. Le message de requête est ensuite adressé en définissant l’en-tête To à l’URI souhaitée. Ensuite, un HttpRequestMessageProperty est créé et le Method est défini sur la méthode GET du verbe HTTP, tandis que le SuppressEntityBody est configuré sur true pour indiquer qu’aucune donnée ne doit être envoyée dans le corps du message de requête HTTP sortant. Enfin, la propriété de requête est ajoutée à la Properties collection du message de requête afin qu’elle puisse influencer la façon dont le transport HTTP envoie la requête. Le message est ensuite prêt à être envoyé sur une instance appropriée du IRequestChannel.

Des techniques similaires peuvent être utilisées sur le service pour extraire le HttpRequestMessageProperty d'un message entrant et construire une réponse.