Información general de la arquitectura de metadatos

Windows Communication Foundation (WCF) proporciona una amplia infraestructura para exportar, publicar, recuperar e importar metadatos de servicio. Los servicios WCF usan metadatos para describir cómo interactuar con los puntos de conexión del servicio, de forma que las herramientas, como Svcutil.exe, puedan generar de forma automática código de cliente para acceder al servicio.

La mayoría de los tipos que constituyen la infraestructura de metadatos WFC residen en el espacio de nombres System.ServiceModel.Description.

WCF usa la clase ServiceEndpoint para describir los puntos de conexión de un servicio. Puede usar WCF para generar metadatos para puntos de conexión de servicio o importar metadatos de servicio para generar instancias de ServiceEndpoint.

WCF representa los metadatos de un servicio en forma de una instancia tipo MetadataSet, cuya estructura está estrechamente ligada al formato de serialización de metadatos que se define en WS-MetadataExchange. El tipo MetadataSet empaqueta los metadatos de servicio reales, como, por ejemplo, documentos del lenguaje de descripción de servicios Web (WSDL), documentos de esquema XML o expresiones de WS-Policy, como una colección de instancias de MetadataSection. Cada instancia de System.ServiceModel.Description.MetadataSection contiene un dialecto de metadatos y un identificador concretos. System.ServiceModel.Description.MetadataSection puede contener los elementos siguientes en su propiedad MetadataSection.Metadata:

Una instancia de System.ServiceModel.Description.MetadataReference apunta a otro punto de conexión de intercambio de metadatos (MEX) y las instancias de System.ServiceModel.Description.MetadataLocation apuntan a un documento de metadatos mediante una dirección URL HTTP. WCF admite el uso de documentos WSDL para describir puntos de conexión de servicio, contratos de servicio, enlaces, patrones de intercambio de mensajes, mensajes y mensajes de error que implementa un servicio. Los tipos de datos utilizados por el servicio se describen en documentos WSDL utilizando el esquema XML. Para obtener más información, consulte Importación y exportación de esquemas. Puede usar WCF a fin de exportar e importar extensiones WSDL para el comportamiento del servicio, los comportamientos de contrato y los elementos de enlace que amplían la funcionalidad de un servicio. Para obtener más información, consulte Procedimiento para exportar metadatos personalizados para una extensión WCF.

Exportación de metadatos de servicios

En WCF, la exportación de metadatos es el proceso que consiste en describir los puntos de conexión de servicio y proyectarlos en una representación paralela y estandarizada que pueden usar los clientes para que entiendan cómo se usa el servicio. Para exportar metadatos desde instancias de ServiceEndpoint, utilice una implementación de la clase abstracta MetadataExporter. Una implementación System.ServiceModel.Description.MetadataExporter genera metadatos que se encapsulan en una instancia MetadataSet.

La clase System.ServiceModel.Description.MetadataExporter proporciona un marco para generar expresiones de directiva que describen las funciones y requisitos de un enlace de extremo y sus operaciones asociadas, mensajes y errores. Estas expresiones de directiva se capturan en una instancia PolicyConversionContext. Una implementación System.ServiceModel.Description.MetadataExporter puede asociar a continuación estas expresiones de directiva a los metadatos que genera.

System.ServiceModel.Description.MetadataExporter llama en cada System.ServiceModel.Channels.BindingElement que implementa la interfaz IPolicyExportExtension en el enlace de ServiceEndpoint al generar un objeto PolicyConversionContext para la implementación System.ServiceModel.Description.MetadataExporter que se va a usar. Puede exportar nuevas aserciones de directiva mediante la implementación de la interfaz IPolicyExportExtension en sus implementaciones personalizadas del tipo BindingElement.

El tipo WsdlExporter es la implementación de la clase abstracta System.ServiceModel.Description.MetadataExporter que se incluye en WCF. El tipo WsdlExporter genera los metadatos WSDL con expresiones de directiva asociadas.

Para exportar metadatos WSDL personalizados o extensiones WSDL para los comportamientos del punto de conexión, comportamientos del contrato o elementos de enlace en un punto de conexión de servicio, puede implementar la interfaz IWsdlExportExtension. WsdlExporter examina una instancia de ServiceEndpoint en búsqueda de elementos de enlace, comportamientos de operaciones, comportamientos de contratos y comportamientos de extremos que implementan la interfaz IWsdlExportExtension al generar el documento WSDL.

Publicación de metadatos de servicios

Los servicios WCF publican metadatos mediante la exposición de uno o varios puntos de conexión de metadatos. La publicación de metadatos de servicios pone a disposición metadatos de servicios mediante protocolos normalizados, como MEX y solicitudes HTTP/GET. Los puntos de conexión de metadatos son similares a otros puntos de conexión de servicio en cuanto que tienen una dirección, un enlace y un contrato. Puede agregar extremos de metadatos a un host de servicio mediante configuración o código.

Para publicar puntos de conexión de metadatos para un servicio WCF, debe agregar primero una instancia de comportamiento del servicio ServiceMetadataBehavior al servicio. Al agregar una instancia de System.ServiceModel.Description.ServiceMetadataBehavior a su servicio, aumenta su servicio con la capacidad de publicar los metadatos mediante la exposición de uno o más puntos de conexión de metadatos. Una vez que agregue el comportamiento del servicio System.ServiceModel.Description.ServiceMetadataBehavior, puede exponer extremos de metadatos que admitan el protocolo MEX o que respondan a solicitudes HTTP/GET.

Para agregar puntos de conexión de metadatos que usen el protocolo MEX, agregue puntos de conexión de servicio al host de servicio que use el contrato de servicio denominado IMetadataExchange. WCF define la interfaz IMetadataExchange que tiene este nombre de contrato de servicio. Los puntos de conexión WS-MetadataExchange o los puntos de conexión MEX, pueden usar uno de los cuatro enlaces predeterminados que los métodos de generador estáticos exponen en la claseMetadataExchangeBindings para encontrar coincidencias con los enlaces predeterminados que usan las herramientas WCF, como Svcutil.exe. También puede configurar puntos de conexión de metadatos MEX mediante un enlace personalizado.

ServiceMetadataBehavior usa un System.ServiceModel.Description.WsdlExporter para exportar metadatos para todos los extremos de servicio al servicio. Para obtener más información sobre el procedimiento para exportar metadatos desde un servicio, consulte Exportación e importación de metadatos.

El ServiceMetadataBehavior aumenta su host de servicio agregando una instancia de ServiceMetadataExtension como una extensión de su host de servicio. System.ServiceModel.Description.ServiceMetadataExtension proporciona la implementación para los protocolos de publicación de metadatos. También puede usar System.ServiceModel.Description.ServiceMetadataExtension para obtener los metadatos del servicio en tiempo de ejecución mediante el acceso a la propiedad Metadata.

Precaución

Si agrega un punto de conexión MEX en el archivo de configuración de la aplicación y después intenta agregar el objeto ServiceMetadataBehavior al host de servicio en el código, obtendrá la excepción siguiente:

System.InvalidOperationException: No se encontró el nombre de contrato 'IMetadataExchange' en la lista de contratos que implementa el servicio Service1. Agregue ServiceMetadataBehavior al archivo de configuración o directamente a ServiceHost para habilitar la compatibilidad para este contrato.

Puede solucionar este problema agregando el ServiceMetadataBehavior en el archivo de configuración o agregando el punto de conexión y ServiceMetadataBehavior en el código.

Para obtener un ejemplo sobre la agregación de ServiceMetadataBehavior en un archivo de configuración de la aplicación, consulte Introducción. Para obtener un ejemplo sobre la agregación de ServiceMetadataBehavior en código, consulte el ejemplo de hospedaje automático.

Precaución

Cuando se publican metadatos para un servicio que expone dos contratos de servicio distintos, cada uno de los cuales contiene una operación con el mismo nombre, se inicia una excepción. Por ejemplo, si dispone de un servicio que expone un contrato de servicio denominado ICarService que tiene una operación Get(Car c) y el mismo servicio expone un contrato de servicio denominado IBookService que tiene una operación Get(Book b), se inicia una excepción o se muestra un mensaje de error al generar los metadatos del servicio. Para solucionar este problema, realice una de las operaciones siguientes:

  • Cambie el nombre de una de las operaciones.
  • Establezca el Name en un nombre distinto.
  • Establezca el espacio de nombres de una de las operaciones en un espacio de nombres distinto mediante la propiedad Namespace.

Recuperación de metadatos de servicios

WCF puede recuperar metadatos de servicio mediante protocolos estandarizados, como WS-MetadataExchange y HTTP. Ambos protocolos están admitidos por el tipo MetadataExchangeClient. Recupera metadatos de servicio utilizando el tipo System.ServiceModel.Description.MetadataExchangeClient mediante la proporción de una dirección y un enlace opcional. El enlace utilizado por una instancia de System.ServiceModel.Description.MetadataExchangeClient puede ser uno de los enlaces predeterminados de la clase estática MetadataExchangeBindings, un enlace proporcionado por el usuario o un enlace cargado desde una configuración de extremo para el contrato IMetadataExchange. System.ServiceModel.Description.MetadataExchangeClient también puede resolver las referencias a la dirección URL HTTP a los metadatos utilizando el tipo HttpWebRequest.

De forma predeterminada, se ata una instancia System.ServiceModel.Description.MetadataExchangeClient a una instancia ChannelFactoryBase única. Puede cambiar o reemplazar la instancia ChannelFactoryBase utilizada por System.ServiceModel.Description.MetadataExchangeClient invalidando el método virtual GetChannelFactory. De igual forma, puede cambiar o reemplazar la instancia de System.Net.HttpWebRequest utilizada por System.ServiceModel.Description.MetadataExchangeClient para realizar solicitudes HTTP/GET mediante la invalidación del método virtual MetadataExchangeClient.GetWebRequest.

Puede recuperar metadatos de servicio mediante solicitudes HTTP/GET o WS-MetadataExchange con la herramienta Svcutil.exe y al pasar el modificador /target:metadata y una dirección. Svcutil.exe descarga los metadatos en la dirección especificada y guarda los archivos en el disco. Svcutil.exe utiliza una instancia de System.ServiceModel.Description.MetadataExchangeClient internamente y carga la configuración de punto de conexión de MEX (desde el archivo de configuración de la aplicación) cuyo nombre coincide con el esquema de la dirección pasada a Svcutil.exe, si existe una. De lo contrario, Svcutil.exe se establece en su valor predeterminado utilizando uno de los enlaces definidos por el tipo de generador estático de MetadataExchangeBindings.

Importación de metadatos de servicios

En WCF, la importación de metadatos es el proceso que consiste en generar una representación abstracta de un servicio o de los componentes de sus metadatos. Por ejemplo, WCF puede importar instancias de ServiceEndpoint, instancias de Binding o bien instancias de ContractDescription a partir de un documento WSDL para un servicio. Para importar los metadatos del servicio en WCF, use una implementación de la clase abstracta MetadataImporter. Los tipos que derivan de la clase System.ServiceModel.Description.MetadataImporter implementan la compatibilidad para la importación de formatos de metadatos que se benefician de la importación lógica de WS-Policy en WCF.

Una implementación de System.ServiceModel.Description.MetadataImporter recoge las expresiones de directivas asociadas a los metadatos del servicio en un objeto PolicyConversionContext. System.ServiceModel.Description.MetadataImporter procesa, a continuación, las directivas como parte de la importación de los metadatos llamando a las implementaciones de la interfaz IPolicyImportExtension de la propiedad PolicyImportExtensions.

Puede agregar compatibilidad para la importación de nuevas aserciones de directivas en un System.ServiceModel.Description.MetadataImporter agregando su propia implementación de la interfaz IPolicyImportExtension a la colección PolicyImportExtensions en una instancia System.ServiceModel.Description.MetadataImporter. De manera alternativa, puede registrar su extensión de importación de directivas en el archivo de configuración de la aplicación cliente.

El tipo System.ServiceModel.Description.WsdlImporter es la implementación de la clase abstracta System.ServiceModel.Description.MetadataImporter que se incluye en WCF. El tipo System.ServiceModel.Description.WsdlImporter importa metadatos del WSDL con directivas adjuntas que se empaquetan en un objeto MetadataSet.

Puede agregar compatibilidad para la importación de extensiones WSDL implementando la interfaz IWsdlImportExtension y agregando, a continuación, su implementación a la propiedad WsdlImportExtensions de su instancia System.ServiceModel.Description.WsdlImporter. El System.ServiceModel.Description.WsdlImporter también puede cargar implementaciones de la interfaz System.ServiceModel.Description.IWsdlImportExtension registrada en el archivo de configuración de la aplicación cliente.

Enlaces dinámicos

Puede actualizar dinámicamente el enlace que utiliza para crear un canal en un extremo de servicio en caso de que el enlace del extremo cambie o usted desee crear un canal en un extremo que utiliza el mismo contrato pero que tiene un enlace diferente. Puede usar la clase estática MetadataResolver para recuperar e importar metadatos en tiempo de ejecución para puntos de conexión de servicio que implementen un contrato concreto. A continuación, puede utilizar los objetos System.ServiceModel.Description.ServiceEndpoint importados para crear un cliente o generador de canales en el punto de conexión deseado.

Consulte también