Configuration de services WCF dans le code

Windows Communication Foundation (WCF) permet aux développeurs de configurer des services à l’aide de fichiers de configuration ou de code. Les fichiers de configuration sont utiles lorsqu'un service doit être configuré après avoir été déployé. Lorsqu'il utilise des fichiers de configuration, un professionnel de l'informatique doit uniquement mettre à jour le fichier de configuration, aucune recompilation n'est nécessaire. Les fichiers de configuration, toutefois, peuvent être complexes et difficiles à gérer. Il n'existe aucune prise en charge du débogage de fichiers de configuration et les éléments de configuration sont référencés par des noms. La création de fichiers de configuration est donc susceptible d'engendrer des erreurs et difficile. WCF vous permet également de configurer des services dans le code. Dans les versions antérieures de WCF (4.0 et versions antérieures), la configuration de services dans le code était simple dans les scénarios auto-hébergés. La classe ServiceHost vous autorisait à configurer les points de terminaison et les comportements avant d’appeler ServiceHost.Open. Dans les scénarios hébergés sur le Web, toutefois, vous n'avez pas accès direct à la classe ServiceHost. Pour configurer un service hébergé sur le Web vous deviez créer un System.ServiceModel.ServiceHostFactory qui créait le ServiceHostFactory et effectuait la configuration nécessaire. À compter de .NET Framework 4.5, WCF offre un moyen plus simple de configurer des services auto-hébergés et hébergés sur le web dans le code.

Méthode Configure

Il suffit de définir une méthode statique publique appelée Configure avec la signature suivante dans votre classe d'implémentation de service :

public static void Configure(ServiceConfiguration config)

La méthode Configure prend une instance ServiceConfiguration qui permet au développeur d'ajouter des points de terminaison et des comportements. Cette méthode est appelée par WCF avant que l’hôte de service ne soit ouvert. S'ils sont définis, les paramètres de configuration du service spécifiés dans un fichier app.config ou web.config sont ignorés.

L'extrait de code suivant montre comment définir la méthode Configure et ajouter un point de terminaison de service, un comportement de point de terminaison et des comportements de service :

public class Service1 : IService1
    {
        public static void Configure(ServiceConfiguration config)
        {
            ServiceEndpoint se = new ServiceEndpoint(new ContractDescription("IService1"), new BasicHttpBinding(), new EndpointAddress("basic"));
            se.Behaviors.Add(new MyEndpointBehavior());
            config.AddServiceEndpoint(se);

            config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
            config.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
        }

        public string GetData(int value)
        {
            return $"You entered: {value}";
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }

Pour activer un protocole tel que https pour un service, vous pouvez soit ajouter explicitement un point de terminaison qui utilise le protocole ou vous pouvez ajouter automatiquement des points de terminaison en appelant ServiceConfiguration.EnableProtocol (Binding) qui ajoute un point de terminaison pour chaque adresse de base compatible avec le protocole et chaque contrat de service défini. L'exemple de code suivant illustre l'utilisation de la méthode ServiceConfiguration.EnableProtocol :

public class Service1 : IService1
{
    public string GetData(int value);
    public static void Configure(ServiceConfiguration config)
    {
        // Enable "Add Service Reference" support
       config.Description.Behaviors.Add( new ServiceMetadataBehavior { HttpGetEnabled = true });
       // set up support for http, https, net.tcp, net.pipe
       config.EnableProtocol(new BasicHttpBinding());
       config.EnableProtocol(new BasicHttpsBinding());
       config.EnableProtocol(new NetTcpBinding());
       config.EnableProtocol(new NetNamedPipeBinding());
       // add an extra BasicHttpBinding endpoint at http:///basic
       config.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(),"basic");
    }
}

Les paramètres de la section <protocolMappings> sont utilisés uniquement si aucun point de terminaison de l’application n’est ajouté à ServiceConfiguration par programme. Vous pouvez également charger la configuration du service à partir du fichier de configuration de l’application par défaut en appelant LoadFromConfiguration, puis modifier les paramètres. La classe LoadFromConfiguration() vous permet également de charger la configuration à partir d'une configuration centralisée. Le code suivant illustre comment implémenter cela :

public class Service1 : IService1
{
    public void DoWork();
    public static void Configure(ServiceConfiguration config)
    {
          config.LoadFromConfiguration(ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = @"c:\sharedConfig\MyConfig.config" }, ConfigurationUserLevel.None));
    }
}

Important

Notez que LoadFromConfiguration ignore les paramètres <host> dans la balise <service> de <system.serviceModel>. Conceptuellement, <host> concerne la configuration de l’hôte, pas la configuration du service, et est chargé avant l’exécution de la méthode Configure.

Voir aussi