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
- Configuración de servicios mediante archivos de configuración
- Configuración de los comportamientos del cliente
- Configuración simplificada
- Configuración
- Activación basada en la configuración en IIS y WAS
- Compatibilidad con metadatos y configuración
- Configuración
- Procedimiento para especificar un enlace de servicio en la configuración
- Procedimiento para crear un punto de conexión de servicio en la configuración
- Procedimiento para publicar metadatos para un servicio mediante un archivo de configuración
- Procedimiento para especificar un enlace de cliente en la configuración