Configurar servicios WCF en el código

El uso de Windows Communication Foundation (WCF) permite que los desarrolladores configuren servicios mediante el uso de archivos de configuración o código. Los archivos de configuración son útiles cuando un servicio se debe configurar después de implementarse. Cuando se usan archivos de configuración, un profesional de TI solo debe actualizar el archivo de configuración; no es necesario que realice ninguna recompilación. Los archivos de configuración, sin embargo, pueden ser complejos y difíciles de mantener. No se admite la depuración de archivos de configuración y se hace referencia a los elementos de configuración por nombre, con lo que la creación de archivos de configuración resulta propensa a errores y difícil. El uso de WCF también permite que se configuren servicios mediante código. En versiones anteriores de WCF (4.0 y anteriores), la configuración de servicios mediante código era sencilla en los escenarios de servicios autohospedados; los puntos de conexión y los comportamientos podían configurarse en la clase ServiceHost antes de que se llamara a ServiceHost.Open. En escenarios hospedados en web, sin embargo, no tiene acceso directo a la clase ServiceHost. Para configurar un servicio hospedado en web era necesario crear un System.ServiceModel.ServiceHostFactory que creó el ServiceHostFactory y realizar cualquier configuración necesaria. A partir de la versión 4.5 de .NET, en WCF se incluye una manera más sencilla de configurar los servicios autohospedados y los servicios hospedados en web mediante código.

El método Configure

Defina simplemente un método estático público denominado Configure con la signatura siguiente en la clase de implementación del servicio:

public static void Configure(ServiceConfiguration config)

El método Configure toma una instancia de ServiceConfiguration que permite al desarrollador agregar puntos de conexión y comportamientos. Antes de que se abra el host de servicio, este método recibe una llamada de WCF. Cuando se definen, los valores de configuración de servicio especificados en un archivo app.config o web.config se omitirán.

El fragmento de código siguiente muestra cómo definir el método Configure y agregar un extremo de servicio, un comportamiento de extremo y comportamientos del servicio:

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

Para habilitar un protocolo como https para un servicio, puede agregar explícitamente un extremo que use el protocolo o puede agregar automáticamente extremos llamando a ServiceConfiguration.EnableProtocol (Binding) que agregue un extremo para cada dirección base compatible con el protocolo y cada contrato de servicio definido. El código siguiente ilustra cómo usar el método 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");
    }
}

Los valores de la sección <protocolMappings> solo se usan si no se agrega ningún extremo de aplicación a la clase ServiceConfiguration mediante programación. Opcionalmente, puede cargar la configuración del servicio desde el archivo de configuración de la aplicación predeterminado mediante una llamada al método LoadFromConfiguration y, después, cambiar los valores. La clase LoadFromConfiguration() también permite cargar la configuración desde una configuración centralizada. El código siguiente muestra cómo implementar esto:

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

Tenga en cuenta que, en el método LoadFromConfiguration, se omiten los valores de <host> que se almacenen en la etiqueta <service> del espacio de nombres <system.serviceModel>. Conceptualmente, el elemento <host> se refiere a la configuración de host (no a la configuración de servicio) y se carga antes de que se ejecute el método Configure.

Consulte también