NetTcp avec Silverlight et IIS

4 minutes read

Dans cet article j’étendrai le projet de mon article précédent pour ajouter un endpoint de type netTcpBinding au service WCF et l’utiliser depuis le client Silverlight.

Configuration du serveur web

C’est probablement la partie la plus ennuyeuse de cet article mais faites attention à ne pas faire de faute ici ou sinon vous aurez de belles surprises. Moi-même j’en ai eu. Notez bien qu’il faut utiliser IIS pour pouvoir utiliser le binding WCF netTcp car le serveur web de Visual Studio ne le prends pas en charge.

1 – Ajout de “Non-HTTP WCF Activation”

Il faut tout d’abord ajouter cette fonctionnalité de Windows. Fiez-vous au screenshot ci-dessous et cochez la case “Windows Communication Foundation Non-HTTP Activation”.

nonhttpwcfactivation

Une fois l’installation effectuée vérifiez que le “Net.Tcp Listener Adapter” est démarré :

nettcplisteneradapterservice

2 – Hébergement du site web dans IIS

Tout d’abord vous devez lancer Visual Studio en tant qu’administrateur pour lui laisser les droits de modification sur votre instance locale de IIS. Pour cet article j’utiliserai exactement le même projet que pour l’article précédent.

Dans les propriétés du projet web je dis à Visual Studio que je souhaite déployer sur mon serveur IIS local (n’oubliez pas de cliquer de le bouton “Create Virtual Directory”).

vswebappproperties

3 – Configuration des liaisons et des protocoles

Ouvrez le gestionnaire de IIS et cherchez le site web qui héberge votre application web (généralement c’est “Default Web Site”).

Ajouter une liaison de type net.tcp sur le port 4502. C’est ce port que nous utiliserons dans notre application Silverlight (Les applications Silverlight s’exécutant dans le navigateur et n’étant pas reconnues comme applications de confiances sont limitées aux ports 4502 à 4534).

addnettcpbindingiis

Vous aurez aussi besoin d’ajouter le protocole netTcp dans la liste des protocoles actifs pour l’application web. Pour cela, sélectionnez l’application web et dans les propriétés avancés ajoutez net.tcp comme dans le screenshot ci-dessous :

addnettcpprotocoliis

La dernière étape de la configuration consister a installer correctement IIS avec .NET 4. Pour celà ouvrez une instance du “Visual Studio Command Prompt” en tant qu’administrateur et entre la ligne de commande suivante : aspnet_regiis.exe –iru

Configuration des services WCF

Maintenant que IIS est configuré correctement, on a besoin de configurer les services WCF. Ici je copierai juste mon fichier de configuration qui permet à la fois le netTcp et le pollingDuplex. Notez que korell est le nom de ma machine et que vous devrez mettre le nom de la votre à la place.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

    <system.serviceModel>
      <extensions>
        <bindingExtensions>
          <add name="pollingDuplexHttpBinding" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </bindingExtensions>
      </extensions>
      <bindings>
        <pollingDuplexHttpBinding>
          <binding name="multipleMessagesPerPollPollingDuplexHttpBinding" duplexMode="MultipleMessagesPerPoll" maxOutputDelay="00:00:00.500" sendTimeout="00:00:02.000" closeTimeout="00:00:02.000" />
        </pollingDuplexHttpBinding>

        <netTcpBinding>
          <binding name="netTcpBindingConfig">
            <security mode="None" />
          </binding>
        </netTcpBinding>

      </bindings>
      <services>
        <service name="SilverlightReactivePushServer.Web.TemperatureService">
          <endpoint address="wsDualHttp" binding="wsDualHttpBinding" contract="SilverlightReactivePushServer.Web.ITemperatureService" />
          <endpoint address="polling" binding="pollingDuplexHttpBinding" bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding" name="pollingDuplex" contract="SilverlightReactivePushServer.Web.ITemperatureService" />
          <endpoint address="netTcp" binding="netTcpBinding" bindingConfiguration="netTcpBindingConfig" contract="SilverlightReactivePushServer.Web.ITemperatureService" />
          <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" />
          <host>
          <baseAddresses>
            <add baseAddress="net.tcp://korell:4502/SilverlightReactivePushServer.Web/TemperatureService.svc" />
            <add baseAddress="http://korell/SilverlightReactivePushServer.Web/TemperatureService.svc" />
          </baseAddresses>
          </host>
        </service>
      </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                  <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>

      <serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true" />
    </system.serviceModel>
</configuration>

On doit aussi ajouter le fichier clientaccesspolicy suivant à la racine du site web (ici c’est Default Web Site) :

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*" />
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true" />
        <socket-resource port="4502-4530" protocol="tcp" />
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

Notez bien que le fichier ci-dessus est très permissif et qu’il ne devrait être utilisé que dans des environnements de développements.

Modification du client Silverlight

Dans le client Silverlight on doit ajouter une référence à System.ServiceModel.NetTcp :

sladdreferencenettcp

On doit aussi modifier le fichier ServiceClient.config pour ajouter le endpoint de type netTcp :

<configuration>
  <system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="httpPolling">
          <binaryMessageEncoding />
          <pollingDuplex duplexMode="MultipleMessagesPerPoll" />
          <httpTransport transferMode="StreamedResponse" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
        </binding>
        <binding name="NetTcpBinding_ITemperatureService">
          <binaryMessageEncoding />
          <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
        </binding>
      </customBinding>
    </bindings>
    <client>
      <endpoint address="http://korell/SilverlightReactivePushServer.Web/TemperatureService.svc/polling"
                binding="customBinding"
                bindingConfiguration="httpPolling"
                contract="TemperatureServer.ITemperatureService"
                name="HttpPollingDuplexBinding_ITemperatureService"/>
      <endpoint address="net.tcp://korell:4502/SilverlightReactivePushServer.Web/TemperatureService.svc/netTcp"
          binding="customBinding" bindingConfiguration="NetTcpBinding_ITemperatureService"
          contract="TemperatureServer.ITemperatureService" name="NetTcpBinding_ITemperatureService" />
    </client>
  </system.serviceModel>
</configuration>

Vous remarquerez que l’on a maintenant deux bindings :

  • NetTcpBinding_ITemperatureService
  • HttpPollingDuplexBinding_ITemperatureService<

On peux choisir lequel sera utilisé dans le constructeur de proxy WCF au web service :

_client = new TemperatureServiceClient("HttpPollingDuplexBinding_ITemperatureService");
// OR
_client = new TemperatureServiceClient("NetTcpBinding_ITemperatureService");</pre>

Et voilà c’est tout. Le proxy WCF utilisé pour les deux bindings est le même, il n’y a rien d’autre à changer. Choisissez juste votre binding et c’est bon. J’ai créé un projet qui permet de changer de binding dynamiquement au runtime. Je n’ai pas d’autre moyens pour vous prouver que cela marche qu’en vous disant d’analyser le trafic réseau de votre pc en utilisant un outil tel que Microsoft Network Monitor. Vous trouver le code source de cette application sur mon skydrive comme toujours.

J’espère que cela vous plaira.

Updated:

Leave a Comment