Share via


Cómo recuperar los metadatos e implementar un servicio conforme

A menudo, no es el mismo rol quien diseña e implementa los servicios. En entornos donde las aplicaciones que interoperan son importantes, los contratos pueden diseñarse o describirse en lenguaje de descripción de servicio web (WSDL), y un desarrollador deberá implementar un servicio compatible con el contrato proporcionado. También puede desear migrar un servicio existente a Windows Communication Foundation (WCF) pero conservar el formato de conexión. Además, los contratos dúplex exigen a los autores de llamadas que también implementen un contrato de devolución de llamada.

En estos casos, debe utilizarse Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) (o una herramienta equivalente) para generar una interfaz del contrato de servicio con un lenguaje administrado que puede implementarse y satisfacer los requisitos del contrato. Normalmente, se utiliza Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para adquirir un contrato de servicios que se utiliza con un generador de canales o un tipo de cliente WCF, así como con un archivo de configuración del cliente que establece el enlace y la dirección correctos. Para utilizar el archivo de configuración generado, debe cambiarlo a un archivo de configuración de servicio. También puede ser necesario modificar el contrato de servicios.

Recuperar datos e implementar un servicio conforme

  1. Utilice Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) en lugar de archivos de metadatos o un extremo de metadatos, para generar un archivo de código.

  2. Busque la parte del archivo de código de salida que contiene la interfaz de interés (en caso de que haya más de una) y que se marca con el atributo System.ServiceModel.ServiceContractAttribute. El ejemplo de código siguiente muestra las dos interfaces generadas por Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe). La primera (ISampleService) es la interfaz del contrato de servicio que se implementa para crear un servicio conforme. La segunda (ISampleServiceChannel) es una interfaz auxiliar, para uso del cliente, que extiende tanto la interfaz del contrato de servicio como System.ServiceModel.IClientChannel, y que se utiliza en una aplicación cliente.

  3. Si el WSDL no especifica una acción de respuesta para todas las operaciones, los contratos de operación generados pueden tener la propiedad ReplyAction establecida en el carácter comodín (*). Quite este valor de propiedades. De lo contrario, al implementar los metadatos del contrato de servicios, éstos no pueden exportarse para esas operaciones.

  4. Implemente la interfaz en una clase y hospede el servicio. Para ver un ejemplo, consulte Cómo implementar un contrato de servicio de Windows Communication Foundation, o bien vea una implementación simple en la sección de ejemplos.

  5. En el archivo de configuración del cliente que genera Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe), cambie la sección de configuración <client><services> a una sección de configuración. (Para obtener un ejemplo de un archivo de configuración de la aplicación generado por un cliente, vea la siguiente sección "Ejemplo").

  6. Dentro de la sección de configuración <services>name, cree un atributo <services> en la sección de configuración para la implementación del servicio.

  7. Establezca el atributo name del servicio en el nombre de configuración para la implementación del servicio.

  8. Agregue los elementos de configuración del extremo que utilizan el contrato de servicios implementado a la sección de configuración de servicio.

Ejemplo

El ejemplo de código siguiente muestra la mayor parte de un archivo de código generado mediante la ejecución de Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) en lugar de los archivos de metadatos.

El código siguiente muestra:

  • La interfaz del contrato de servicio que, una vez implementada, es conforme a los requisitos de contrato (ISampleService).

  • La interfaz auxiliar para uso del cliente que extiende tanto la interfaz de contrato del servicio como System.ServiceModel.IClientChannel, y que se utiliza en una aplicación cliente (ISampleServiceChannel).

  • La clase auxiliar que extiende System.ServiceModel.ClientBase, y que se utiliza en una aplicación cliente (SampleServiceClient).

  • El archivo de configuración generado desde el servicio.

  • Una implementación de servicio ISampleService simple.

  • Una conversión del archivo de configuración del cliente en una versión del servicio.

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
                name="BasicHttpBinding_ISampleService" />
        </client>
    </system.serviceModel>
</configuration>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service
          name="Microsoft.WCF.Documentation.SampleService">
        <endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
            />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Vea también

Conceptos

Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe)