Interopérabilité WCF / WSIT

J'ai eu l'occasion aujourd'hui de faire quelques tests d'interopérabilité WCF/WSIT (https://wsit.dev.java.net/) en compagnie d'Alexis Moussine Pouchkine, architecte chez SUN (https://blogs.sun.com/alexismp/)

A la différence de précédents tests réalisés dans le contexte du Starter Kit PRESTO, plutôt que de confronter nos implémentations client et service une fois celles-ci validées dans nos environnements respectifs, nous sommes partis uniquement d'un accord sur le WSDL, qu'Alexis a utilisé comme base de description pour l'interface de son service, qu'il a fait évoluer progressivement pour lui associer différentes caractéristiques de fonctionnement (MTOM, Reliable Messaging). De mon côté, j'ai "bâti" le client WCF consommant ce service selon deux approches :

· approche statique : "Add Service Reference" depuis Visual Studio 2005, puis modification du fichier de configuration en fonction des paramètres du service (modification soit manuelle, soit par mise à jour de la référence au service).

Cette approche a porté ses fruits pour l'ensemble des caractéristiques ciblées. Il est cependant nécessaire d'ajouter manuellement le binding de niveau transport au custom Binding associé au service (alors qu'en environnement full WCF, ce binding est ajouté automatiquement).

<customBinding>

  <binding name="PrestoSvcSoap12">

         <textMessageEncoding />

          < httpTransport />

</binding>

</customBinding>

· approche dynamique, ce qui suppose côté client, un minimum de code pour balayer la collection des endpoints obtenue via le protocole "WS-MetadataExchange" et ajout du BindingElement HttpTransport manquant à la collection de bindings du endpoint cible .

ChannelFactory<PrestoSvcSoap12> factory = null;

Uri mexUri = new Uri("https://192.168.0.1:7000/PrestoApp/PrestoSvc?wsdl");

ContractDescription contract =

ContractDescription.GetContract(typeof(PrestoSvcSoap12));

EndpointAddress mexEndpointAddress = new EndpointAddress(mexUri);

ServiceEndpointCollection endpoints =

MetadataResolver.Resolve(contract.ContractType, mexEndpointAddress);

foreach (ServiceEndpoint endpoint in endpoints)

      {

      if (endpoint.Contract.Namespace.Equals(contract.Namespace) &&

 endpoint.Contract.Name.Equals(contract.Name))

            {

            Binding dynamicBinding = endpoint.Binding;

       BindingElementCollection dynamicBindingCollection =

 dynamicBinding.CreateBindingElements();

            HttpTransportBindingElement httpTransportBindingElement =

new HttpTransportBindingElement();

  dynamicBindingCollection.Add(httpTransportBindingElement);

CustomBinding currentBinding = new

      CustomBinding (dynamicBindingCollection);

                   

            factory = new ChannelFactory<PrestoSvcSoap12>(currentBinding, endpoint.Address);

            }

      }