Configurar servicios WCF en el códigoConfiguring WCF Services in Code

Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) permite a los desarrolladores configurar servicios mediante archivos de configuración o código. allows developers to configure services using configuration files or code. Los archivos de configuración son útiles cuando un servicio se debe configurar después de implementarse.Configuration files are useful when a service needs to be configured after being deployed. 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.When using configuration files, an IT professional only needs to update the configuration file, no recompilation is required. Los archivos de configuración, sin embargo, pueden ser complejos y difíciles de mantener.Configuration files, however, can be complex and difficult to maintain. 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.There is no support for debugging configuration files and configuration elements are referenced by names which makes authoring configuration files error-prone and difficult. WCFWCF también permite configurar servicios en el código. also allows you to configure services in code. En versiones anteriores de WCFWCF (4.0 y anteriores), la configuración de servicios en código era sencilla en escenarios autohospedados; la clase ServiceHost permitía configurar extremos y comportamientos antes de llamar a ServiceHost.Open.In earlier versions of WCFWCF (4.0 and earlier) configuring services in code was easy in self-hosted scenarios, the ServiceHost class allowed you to configure endpoints and behaviors prior to calling ServiceHost.Open. En escenarios hospedados en web, sin embargo, no tiene acceso directo a la clase ServiceHost.In web hosted scenarios, however, you don’t have direct access to the ServiceHost class. Para configurar un servicio hospedado en web era necesario crear un System.ServiceModel.ServiceHostFactory que creó el ServiceHostFactory y realizar cualquier configuración necesaria.To configure a web hosted service you were required to create a System.ServiceModel.ServiceHostFactory that created the ServiceHostFactory and performed any needed configuration. A partir de .NET 4.5, WCFWCF proporciona una manera más fácil de configurar los servicios autohospedados y los hospedados en web en el código.Starting with .NET 4.5, WCFWCF provides an easier way to configure both self-hosted and web hosted services in code.

El método ConfigureThe Configure method

Defina simplemente un método estático público denominado Configure con la signatura siguiente en la clase de implementación del servicio:Simply define a public static method called Configure with the following signature in your service implementation class:

public static void Configure(ServiceConfiguration config)  

El método Configure toma una instancia de ServiceConfiguration que permite al desarrollador agregar extremos y comportamientos.The Configure method takes a ServiceConfiguration instance that enables the developer to add endpoints and behaviors. WCFWCF llama a este método antes de abrir el host de servicio.This method is called by WCFWCF before the service host is opened. Cuando se definen, los valores de configuración de servicio especificados en un archivo app.config o web.config se omitirán.When defined, any service configuration settings specified in an app.config or web.config file will be ignored.

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:The following code snippet illustrates how to define the Configure method and add a service endpoint, an endpoint behavior and service behaviors:

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 string.Format("You entered: {0}", 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 punto de conexión que use el protocolo o puede agregar automáticamente puntos de conexión llamando a ServiceConfiguration.EnableProtocol (enlace) que agregue un punto de conexión para cada dirección base compatible con el protocolo y cada contrato de servicio definido.To enable a protocol such as https for a service, you can either explicitly add an endpoint that uses the protocol or you can automatically add endpoints by calling ServiceConfiguration.EnableProtocol(Binding) which adds an endpoint for each base address compatible with the protocol and each service contract defined. El código siguiente ilustra cómo usar el método ServiceConfiguration.EnableProtocol:The following code illustrates how to use the ServiceConfiguration.EnableProtocol method:

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 BasicHttpBinding());   
       config.EnableProtocol(new NetTcpBinding());   
       config.EnableProtocol(new NetNamedPipeBinding());   
       // add an extra BasicHttpBinding endpoint at http:///basic   
       config.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(),"basic");   
    }   
}   

La configuración en el <protocolMappings> sección sólo se utilizarán si no hay extremos de la aplicación se agregan a la ServiceConfiguration mediante programación. Si lo desea, puede cargar la configuración del servicio desde el archivo de configuración de aplicación predeterminado mediante una llamada a LoadFromConfiguration y, a continuación, cambiar la configuración.The settings in the <protocolMappings> section are only used if no application endpoints are added to the ServiceConfiguration programmatically.You can optionally load the service configuration from the default application configuration file by calling LoadFromConfiguration and then change the settings. La clase LoadFromConfiguration() también permite cargar la configuración desde una configuración centralizada.The LoadFromConfiguration() class also allows you to load configuration from a centralized configuration. El código siguiente muestra cómo implementar esto:The following code illustrates how to implement this:

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 LoadFromConfiguration omite <host> configuración de la <service> etiqueta de <system.serviceModel>.Note that LoadFromConfiguration ignores <host> settings within the <service> tag of <system.serviceModel>. Conceptualmente, <host> trata sobre la configuración del host, no configuración del servicio y se cargan antes de que se ejecuta el método de configurar.Conceptually, <host> is about host configuration, not service configuration, and it gets loaded before the Configure method executes.

Vea tambiénSee Also

Configuración de servicios mediante archivos de configuraciónConfiguring Services Using Configuration Files
Configuración de los comportamientos del clienteConfiguring Client Behaviors
Configuración simplificadaSimplified Configuration
Activación basada en la configuraciónConfiguration-Based Activation
ConfiguraciónConfiguration
Activación basada en la configuración en IIS y WASConfiguration-Based Activation in IIS and WAS
Compatibilidad con metadatos y configuraciónConfiguration and Metadata Support
ConfiguraciónConfiguration
Cómo especificar un enlace de servicio en la configuraciónHow to: Specify a Service Binding in Configuration
Creación de un punto de conexión de servicio en configuraciónHow to: Create a Service Endpoint in Configuration
Publicación de metadatos para un servicio mediante un archivo de configuraciónHow to: Publish Metadata for a Service Using a Configuration File
Cómo especificar un enlace de cliente en la configuraciónHow to: Specify a Client Binding in Configuration