Interopérabilité avec les applications POX

Les applications de style 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 les navigateurs web et les 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 des services reposant sur POX.

Notes

À l’origine, ce document a été écrit pour .NET Framework 3.0. .NET Framework 3.5 dispose d’une prise en charge intégrée pour une utilisation avec des applications POX. Pour plus d’informations, consultez Vue d’ensemble du modèle de programmation HTTP web WCF.

Programmation POX avec WCF

Les services WCF qui communiquent par HTTP à l’aide de messages POX utilisent une <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 configuré spécialement pour utiliser la valeur None, ce qui lui permet de traiter des charges utiles de messages XML qui n’arrivent pas encapsulés dans une enveloppe SOAP.

Les clients WCF qui communiquent par HTTP à l’aide de messages POX utilisent une liaison semblable (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 HttpTransportBindingElement avec un mode d'adressage manuel en affectant à la propriété ManualAddressing la valeur true sur l'élément. Cela permet aux messages d'être adressés explicitement par le code d'application et il n'est pas nécessaire de créer une ChannelFactory chaque fois qu'une application envoie un message à un URI HTTP différent.

Étant donné que les messages POX n'utilisent pas d'en-tête SOAP pour acheminer des informations de protocole importantes, les clients et les services POX doivent souvent traiter des parties 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 et codes d’état HTTP, sont signalées dans le modèle de programmation WCF à travers deux classes :

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

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

L’exemple de code suivant indique comment créer un message de demande 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 );

En premier lieu, un demande Message vide est créée en appelant CreateMessage(MessageVersion, String). Le paramètre None est utilisé pour indiquer qu'une enveloppe SOAP n'est pas requise et le paramètre Empty est passé comme Action. Puis le message de demande est adressé en affectant à l'en-tête To l'URI désiré. Ensuite, une HttpRequestMessageProperty est créée et la Method a pour valeur la méthode GET de verbe HTTP et le SuppressEntityBody a la valeur true pour indiquer qu'aucunes données ne doivent être envoyées dans le corps du message de requête HTTP sortant. Enfin, la propriété de demande est ajoutée à la collection Properties du message de demande de manière à pouvoir influencer la manière dont le transport HTTP envoie la demande. Le message est alors prêt à être envoyé sur une instance appropriée de IRequestChannel.

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