Configuración de servicios mediante archivos de configuración

Configurar un servicio de Windows Communication Foundation (WCF) mediante un archivo de configuración le permitirá proporcionar datos de comportamiento de punto de conexión y servicio en el punto de implementación en lugar de hacerlo en la fase de diseño. En este tema se describen las principales técnicas disponibles.

Los servicios WCF se pueden configurar mediante el uso de la tecnología de configuración de .NET Framework. Normalmente, al archivo Web.config suelen agregarse elementos XML que se corresponden con un sitio de Internet Information Services (IIS) que, a su vez, hospeda un servicio WCF. Los elementos le permiten cambiar detalles como las direcciones de extremos (las direcciones reales utilizadas para comunicarse con el servicio) equipo a equipo. Además, en la infraestructura WCF se incluyen varios elementos proporcionados por el sistema que se pueden usar para seleccionar rápidamente las características más básicas de un servicio. Desde la versión 4 de .NET Framework, WCF incluye un nuevo modelo de configuración predeterminado que simplifica sus requisitos de configuración. Si no se proporciona una configuración de WCF para un servicio concreto, el runtime lo configurará automáticamente con ciertos puntos de conexión estándar y ciertos enlaces y comportamientos predeterminados. En la práctica, escribir la configuración es una de las partes principales de la programación de aplicaciones de WCF.

Para obtener más información, consulte Configuración de enlaces para servicios. Para obtener una lista de los elementos más utilizados, consulte Enlaces proporcionados por el sistema. Para obtener más información sobre los puntos de conexión, enlaces y comportamientos predeterminados, vea Configuración simplificada y Configuración simplificada de los servicios de WCF.

Importante

Al implementar escenarios en paralelo con dos versiones diferentes de un servicio, es necesario especificar los nombres parciales de los ensamblados a los que se hace referencia en los archivos de configuración. Esto se debe a que el archivo de configuración se comparte entre todas las versiones de un servicio y se podrían estar ejecutando con versiones diferentes de .NET Framework.

System.Configuration: Web.config y App.config

La infraestructura WCF utiliza el sistema de configuración System.Configuration del componente .NET Framework.

Cuando configure un servicio en Visual Studio, use un archivo Web.config o App.config para especificar los valores. El entorno de hospedaje determina la elección realizada del nombre del archivo de configuración para el servicio. Si está utilizando IIS para hospedar su servicio, utilice un archivo Web.config. Si está utilizando cualquier otro entorno de hospedaje, utilice un archivo App.config.

En Visual Studio, el archivo que se denomina App.config se usa para crear el archivo de configuración final. El nombre final realmente utilizado para la configuración depende del nombre de ensamblado. Por ejemplo, un ensamblado denominado "Cohowinery.exe" tiene un nombre final de archivo de configuración de "Cohowinery.exe.config". Sin embargo, solo necesita modificar el archivo App.config. Los cambios realizados en ese archivo se realizan automáticamente en tiempo de compilación en el archivo final de configuración de la aplicación.

Al utilizar un archivo App.config, el sistema de configuración combina el archivo App.config con el contenido del archivo Machine.config cuando se inicia la aplicación y se aplica la configuración. Este mecanismo permite definir los valores de equipo en el archivo Machine.config. El archivo App.config se puede utilizar para reemplazar los valores del archivo Machine.config; también puede bloquear los valores en el archivo Machine.config para que se utilicen. En el caso de Web.config, el sistema de configuración combina los archivos Web.config de todos los directorios que conducen al directorio de la aplicación en la configuración que se aplica. Para obtener más información sobre la configuración y las prioridades de los valores, consulte los temas que tratan sobre el espacio de nombres System.Configuration.

Secciones principales del archivo de configuración

Las secciones principales del archivo de configuración incluyen los elementos siguientes.

<system.ServiceModel>  
  
   <services>  
   <!-- Define the service endpoints. This section is optional in the new  
    default configuration model in .NET Framework 4. -->  
      <service>  
         <endpoint/>  
      </service>  
   </services>  
  
   <bindings>  
   <!-- Specify one or more of the system-provided binding elements,  
    for example, <basicHttpBinding> -->
   <!-- Alternatively, <customBinding> elements. -->  
      <binding>  
      <!-- For example, a <BasicHttpBinding> element. -->  
      </binding>  
   </bindings>  
  
   <behaviors>  
   <!-- One or more of the system-provided or custom behavior elements. -->  
      <behavior>  
      <!-- For example, a <throttling> element. -->  
      </behavior>  
   </behaviors>  
  
</system.ServiceModel>  

Nota

Las secciones de enlaces y comportamientos son opcionales y solo se incluyen si son necesarias.

El elemento <services>

El elemento services contiene las especificaciones para todos los servicios que la aplicación hospeda. Esta sección es opcional desde el lanzamiento del modelo de configuración simplificado en la versión 4 de .NET Framework.

<services>

El elemento <service>

Cada elemento service tiene estos atributos:

  • name. Especifica el tipo que proporciona una implementación de un contrato de servicios. Este es un nombre completo que consta del espacio de nombres, un punto y el nombre del tipo. Por ejemplo, "MyNameSpace.myServiceType".

  • behaviorConfiguration. Especifica el nombre de uno de los elementos behavior encontrados en el elemento behaviors . El comportamiento especificado rige las acciones como si el servicio permitiese la suplantación. Si su valor es el nombre vacío o no se proporciona ningún atributo behaviorConfiguration , se agrega al servicio el conjunto predeterminado de comportamientos de servicio.

  • <service>

El elemento <endpoint>

Cada extremo requiere una dirección, un enlace y un contrato, que están representados por los atributos siguientes:

  • address. Especifica el Identificador uniforme de recursos (URI) del servicio, que puede ser una dirección absoluta o una relativa a la dirección base del servicio. Si está establecido en una cadena vacía, indica que el extremo está disponible en la dirección base que se especifica al crear ServiceHost para el servicio.

  • binding. Normalmente especifica un enlace proporcionado por el sistema como WSHttpBinding, pero también puede especificar un enlace definido por el usuario. El enlace especificado determina el tipo de transporte, seguridad y codificación utilizados y si se admiten o habilitan sesiones confiables, transacciones, o la transmisión por secuencias.

  • bindingConfiguration. Si se deben modificar los valores predeterminados de un enlace, esto se puede hacer configurando el elemento de binding adecuado en el elemento bindings . Este atributo debería recibir el mismo valor que el atributo name del elemento de binding que se utiliza para cambiar los valores predeterminados. Si no se proporciona ningún nombre, o no se especifica ningún atributo bindingConfiguration en el enlace, se usa el enlace predeterminado del tipo de enlace en el extremo.

  • contract. Especifica la interfaz que define el contrato. Ésta es la interfaz implementada en el tipo de Common Language Runtime (CLR) especificado por el atributo name del elemento service .

  • <endpoint>

El elemento <bindings>

El elemento bindings contiene las especificaciones para todos los enlaces que puede utilizar cualquier extremo definido en cualquier servicio.

<bindings>

El elemento <binding>

El elemento binding contenidos en el elemento bindings pueden ser uno de los enlaces proporcionados por el sistema (consulte System-Provided Bindings) o un enlace personalizado (consulte Custom Bindings). El elemento binding tiene un atributo name que pone en correlación el enlace con el extremo especificado en el atributo bindingConfiguration del elemento endpoint . Si no se especifica ningún nombre, dicho enlace corresponde al enlace predeterminado de ese tipo de enlace.

Para obtener más información sobre el proceso de configuración de servicios y clientes, consulte Configuración de servicios WCF.

<binding>

El elemento <behaviors>

Éste es un elemento contenedor para los elementos behavior que definen los comportamientos de un servicio.

<behaviors>

El elemento <behavior>

Cada elemento behavior se identifica mediante un atributo name y se usa para proporcionar un comportamiento proporcionado por el sistema, como <throttling>, o uno personalizado. Si no se especifica ningún nombre, dicho elemento de comportamiento corresponde al servicio predeterminado o al comportamiento de extremo.

<behavior>

Uso de las configuraciones de comportamientos y enlaces

Gracias al motor WCF, compartir las configuraciones entre puntos de conexión es más sencillo mediante el uso de un sistema de referencia en la configuración. En lugar de asignar directamente los valores de configuración a un extremo, los valores de configuración relacionados con el enlace se agrupan en elementos bindingConfiguration de la sección <binding> . Una configuración de enlace es un grupo con nombre de valores en un enlace. Entonces, los extremos pueden hacer referencia a bindingConfiguration por nombre.

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
 <system.serviceModel>  
  <bindings>  
    <basicHttpBinding>  
     <binding name="myBindingConfiguration1" closeTimeout="00:01:00" />  
     <binding name="myBindingConfiguration2" closeTimeout="00:02:00" />  
     <binding closeTimeout="00:03:00" />  <!-- Default binding for basicHttpBinding -->  
    </basicHttpBinding>  
     </bindings>  
     <services>  
      <service name="MyNamespace.myServiceType">  
       <endpoint
          address="myAddress" binding="basicHttpBinding"
          bindingConfiguration="myBindingConfiguration1"  
          contract="MyContract"  />  
       <endpoint
          address="myAddress2" binding="basicHttpBinding"
          bindingConfiguration="myBindingConfiguration2"  
          contract="MyContract" />  
       <endpoint
          address="myAddress3" binding="basicHttpBinding"
          contract="MyContract" />  
       </service>  
      </services>  
    </system.serviceModel>  
</configuration>  

El name de la bindingConfiguration se establece en el elemento <binding> . El atributo name debe ser una cadena única dentro del ámbito del tipo de enlace (en este caso, el elemento <basicHttpBinding>) o un valor vacío que se use para hacer referencia al enlace predeterminado. El extremo vincula a la configuración estableciendo el atributo bindingConfiguration en esta cadena.

Una behaviorConfiguration se implementa de la misma manera, tal y como se muestra en el ejemplo siguiente.

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>  
        <behavior name="myBehavior">  
           <callbackDebug includeExceptionDetailInFaults="true" />  
         </behavior>  
      </endpointBehaviors>  
      <serviceBehaviors>  
        <behavior>  
          <serviceMetadata httpGetEnabled="true" />  
        </behavior>  
      </serviceBehaviors>  
  
    </behaviors>  
    <services>  
     <service name="NewServiceType">  
       <endpoint
          address="myAddress3" behaviorConfiguration="myBehavior"  
          binding="basicHttpBinding"  
          contract="MyContract" />  
      </service>  
    </services>  
   </system.serviceModel>  
</configuration>  

Observe que el conjunto predeterminado de comportamientos de servicio se agrega al servicio. Este sistema permite a los extremos compartir configuraciones comunes sin volver a definir la configuración. Si el ámbito debe establecerse en el nivel de máquina, cree la configuración de enlace o comportamiento en el archivo Machine.config. Los valores de configuración están disponibles en todos los archivos App.config. Configuration Editor Tool (SvcConfigEditor.exe) facilita la creación de configuraciones.

Combinación de comportamientos

La característica de combinación de comportamientos simplifica la administración de los comportamientos cuando se desea el uso coherente de un conjunto de comportamientos comunes. Esta característica permite especificar comportamientos en niveles diferentes de la jerarquía de configuración y hacer que los servicios hereden los comportamientos de varios niveles de la jerarquía de configuración. Para mostrar cómo funciona, supongamos que tiene el siguiente diseño de directorio virtual en IIS:

~\Web.config~\Service.svc~\Child\Web.config~\Child\Service.svc

Y que el archivo ~\Web.config tiene el siguiente contenido:

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior>  
          <serviceDebug includeExceptionDetailInFaults="True" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

Y tiene un archivo Web.config secundario ubicado en ~\Child\Web.config con el siguiente contenido:

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior>  
          <serviceMetadata httpGetEnabled="True" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

El servicio ubicado en ~\Child\Service.svc se comportará como si tuviese los comportamientos de serviceMetadata y serviceDebug. El servicio ubicado en ~\Service.svc tendrá solo el comportamiento de serviceDebug. Lo que sucede es que se combinan las dos colecciones de comportamientos con el mismo nombre (en este caso, la cadena vacía).

También puede borrar colecciones de comportamientos mediante el uso de la etiqueta <clear>, así como quitar comportamientos individuales de la colección mediante la etiqueta <remove>. Por ejemplo, las dos configuraciones siguientes hacen que el servicio secundario tenga únicamente el comportamiento de serviceMetadata:

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior>  
          <remove name="serviceDebug"/>  
          <serviceMetadata httpGetEnabled="True" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  
</configuration>  
<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior>  
          <clear/>  
          <serviceMetadata httpGetEnabled="True" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

La combinación de comportamientos se lleva a cabo para colecciones de comportamientos sin nombre, como se muestra arriba, y colecciones de comportamientos con nombre.

El proceso de combinación de comportamientos funciona en el entorno de hospedaje de IIS, donde los archivos Web.config se combinan jerárquicamente con los archivos Web.config y machine.config raíz. No obstante, este también funciona en el entorno de la aplicación, donde el archivo machine.config se puede combinar con el archivo App.config.

La combinación de comportamientos se aplica a comportamientos de extremo y comportamientos de servicio en la configuración.

Si una colección de comportamientos secundarios contiene un comportamiento que ya se encuentra en la colección de comportamientos primarios, el comportamiento secundario invalida el primario. De este modo, si una colección de comportamientos primarios tuviese el comportamiento <serviceMetadata httpGetEnabled="False" /> y una colección de comportamientos secundarios tuviese el comportamiento <serviceMetadata httpGetEnabled="True" />, el comportamiento secundario invalidaría al comportamiento primario en la colección de comportamientos y httpGetEnabled tendría el valor "true".

Consulte también