Hébergement d'un service WCF sans fichier .svc dans IIS et adaptation des options de binding

Une des nouveautés de WCF 4.0 est le "no config" dans les fichiers app.config et web.config. Mais peu de personnes semblent au courant de cette nouveauté. Ce post est donc la pour expliquer comment réaliser des services hébergés sous IIS ou WAS sans svc et avec un minimum de configuration.

1°) Création de l'interface du service

namespace MyLibrary
{
    [ServiceContract]
    public interface IMyInterface
    {
        [OperationContract]
        string GetHello(string value);
    }
}

2°) Implémentation de l'interface du service

namespace MyLibrary
{
    [ServiceBehavior]
    public class MyServer : IMyInterface
    {
        public string GetHello(string value)
        {
            return "Hello " + value;
        }
    }
}

3°) Configuration minimaliste dans le fichier web.config.

Une des nouveautés de WCF 4.0 repose sur la possibilité de ne plus passer par un fichier "svc" mais de définir un service (la classe concrète) vers une uri. Ceci se fait comme expliqué dans l'exemple ci-dessous en ajoutant une ligne dans les serviceActivations. En faisant ceci, nous obtenons un service WCF totalement fonctionnel. Cependant, autre nouveauté de WCF4, nous avons des "binding" par défaut selon le protocole d'appel. Par exemple, en tentant d'accéder à http://localhost/MyTest.svc, nous allons utiliser le binding basicHttpBinding. Mais quid si nous voulons de la sécurité ou WS-* dans nos services ?

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
      <serviceActivations>
        <add relativeAddress="MyTest.svc" service="MyLibrary.MyServer"/>
      </serviceActivations>
    </serviceHostingEnvironment>
  </system.serviceModel>
 </configuration>

4°) Adaptation du binding souhaité pour le service déclaré

Comme expliqué au point 3, si nous sommes en http, par défaut nous allons utiliser le basicHttpBinding. Pour changer cela, il faut redéfinir le service (comme expliqué ci-dessous). En réalisant ceci-ci, nous pouvons ajuster les configurations.

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="MyLibrary.MyServer">
        <endpoint binding="wsHttpBinding" contract="MyLibrary.IMyInterface"/>
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
      <serviceActivations>
        <add relativeAddress="MyTest.svc" service="MyLibrary.MyServer"/>
      </serviceActivations>
    </serviceHostingEnvironment>
  </system.serviceModel>
 </configuration>

5°) Conclusion

Je suis disponible en cas de questions. J'espère avoir pu vous aider dans la simplification de vos configurations.

Commentaires

1. Le lundi, février 28 2011, 12:43 par SuperDamz

Est-ce que ne pas avoir de fichier .svc est compatible avec le "Discover Services in Solution" de Visual Studio ?

Parce que sinon, ça n'apporte pas grand chose par rapport à ce qui existait déjà dans System.ServiceModel.Activation...

2. Le lundi, mars 28 2011, 16:31 par Thibaut David

Bonjour,

merci pour cet article (et ceux à venir) permettant de mettre le doigt sur les multiples parties de WCF aussi puissantes que méconnues.
Je te propose d'ajouter un lien vers un article des MSDN expliquant la nouveauté des bindings par défaut de WCF 4 pour ceux qui désire aller plus loin sur ce sujet.
http://msdn.microsoft.com/en-us/lib...

bonne continuation.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.