Configurazione dei servizi WCF nel codice

Windows Communication Foundation (WCF) consente agli sviluppatori di configurare i servizi usando file di configurazione o codice. I file di configurazione sono utili quando è necessario configurare un servizio dopo la relativa distribuzione. Quando si utilizzano i file di configurazione, un professionista IT deve solo aggiornare il file di configurazione. Non è necessario eseguire la ricompilazione. I file di configurazione, tuttavia, possono risultare complessi e difficili da gestire. Non è disponibile alcun supporto per il debug dei file di configurazione e, poiché il riferimento agli elementi di configurazione viene fatto in base ai nomi, i file di configurazione della creazione possono risultare difficili e soggetti a errori. WCF consente inoltre di configurare i servizi nel codice. Nelle versioni precedenti di WCF (4.0 e versioni precedenti), la configurazione dei servizi nel codice era semplice negli scenari indipendenti. La classe ServiceHost consentiva di configurare endpoint e comportamenti prima di chiamare ServiceHost.Open. Negli scenari ospitati dal Web, tuttavia, non è possibile accedere direttamente alla classe ServiceHost. Per configurare un servizio ospitato dal Web era necessario creare un oggetto System.ServiceModel.ServiceHostFactory che creava l'oggetto ServiceHostFactory ed effettuava qualsiasi configurazione richiesta. A partire da .NET Framework 4.5, WCF fornisce un modo più semplice per configurare sia i servizi indipendenti sia quelli ospitati dal Web nel codice.

Metodo Configure

Definire semplicemente un metodo statico pubblico denominato Configure con la firma seguente nella classe di implementazione del servizio:

public static void Configure(ServiceConfiguration config)

Il metodo Configure accetta un'istanza dell'oggetto ServiceConfiguration che consente allo sviluppatore di aggiungere endpoint e comportamenti. Questo metodo viene chiamato da WCF prima che venga aperto l'host del servizio. Una volta definito, tutte le impostazioni di configurazione del servizio specificate in un file app.config o web.config verranno ignorate.

Nel frammento di codice riportato di seguito viene illustrato come definire il metodo Configure e aggiungere un endpoint del servizio, un comportamento dell'endpoint e comportamenti del servizio:

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;
        }
    }

Per abilitare un protocollo come HTTPS per un servizio, è possibile aggiungere in modo esplicito un endpoint che utilizza il protocollo oppure aggiungere automaticamente gli endpoint chiamando ServiceConfiguration.EnableProtocol(Binding) che aggiunge un endpoint per ogni indirizzo di base compatibile con il protocollo e ogni contratto di servizio definito. Nel codice seguente viene illustrato come utilizzare il metodo 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");
    }
}

Le impostazioni della sezione <protocolMappings> vengono usate solo se non viene aggiunto alcun endpoint dell'applicazione all'oggetto ServiceConfiguration a livello di codice. Facoltativamente è possibile caricare la configurazione del servizio dal file di configurazione dell'applicazione predefinito chiamando il metodo LoadFromConfiguration e quindi modificare le impostazioni. La classe LoadFromConfiguration() consente inoltre di caricare la configurazione da una configurazione centralizzata. Nell'esempio di codice seguente viene illustrato come implementare questa azione:

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));
    }
}

Importante

Si noti che LoadFromConfiguration ignora le impostazioni di <host> all'interno del tag <service> di <system.serviceModel>. Concettualmente, l'impostazione <host> riguarda la configurazione host, non la configurazione del servizio, e viene caricata prima dell'esecuzione del metodo Configure.

Vedi anche