Compartir vía


Introducción a la arquitectura de metadatos

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

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

WCF usa la ServiceEndpoint clase 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 ServiceEndpoint instancias.

WCF representa los metadatos de un servicio como una instancia del MetadataSet tipo , la estructura de la que está estrechamente vinculada al formato de serialización de metadatos definido en WS-MetadataExchange. El MetadataSet tipo agrupa los metadatos de servicio reales, como documentos del lenguaje de descripción de servicios web (WSDL), documentos de esquema XML o expresiones de WS-Policy, como una colección de MetadataSection instancias. Cada System.ServiceModel.Description.MetadataSection instancia contiene un dialecto de metadatos específico y un identificador. Un System.ServiceModel.Description.MetadataSection puede contener los siguientes elementos en su MetadataSection.Metadata propiedad:

Las System.ServiceModel.Description.MetadataReference instancias apuntan a otro punto de conexión de intercambio de metadatos (MEX) y las System.ServiceModel.Description.MetadataLocation instancias apuntan a un documento de metadatos usando una 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 implementados por un servicio. Los tipos de datos usados por el servicio se describen en documentos WSDL mediante el esquema XML. Para obtener más información, consulte Importación y exportación de esquemas. Puede usar WCF para 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, vea Exportar metadatos personalizados para una extensión WCF.

Exportación de metadatos de servicio

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

La System.ServiceModel.Description.MetadataExporter clase proporciona un marco para generar expresiones de directiva que describen las funcionalidades y los requisitos de un enlace de punto de conexión y sus operaciones, mensajes y errores asociados. Estas expresiones de directiva se capturan en una instancia PolicyConversionContext. Una System.ServiceModel.Description.MetadataExporter implementación puede adjuntar 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 las implementaciones personalizadas del tipo BindingElement.

El WsdlExporter tipo es la implementación de la System.ServiceModel.Description.MetadataExporter clase abstracta incluida con WCF. El WsdlExporter tipo genera metadatos WSDL con expresiones de directiva adjuntas.

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

Metadatos del servicio de publicación

Los servicios WCF publican metadatos mediante la exposición de uno o varios puntos de conexión de metadatos. Los metadatos del servicio de publicación hacen que los metadatos del servicio estén disponibles mediante protocolos estandarizados, como las solicitudes MEX y HTTP/GET. Los puntos de conexión de metadatos son similares a otros puntos de conexión de servicio en 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. Agregar una System.ServiceModel.Description.ServiceMetadataBehavior instancia a tu servicio añade a tu servicio la capacidad de publicar metadatos exponiendo uno o varios puntos finales de metadatos. Una vez que agregue el comportamiento del System.ServiceModel.Description.ServiceMetadataBehavior servicio, puede exponer puntos de conexión de metadatos que admitan el protocolo MEX o los puntos de conexión de metadatos que responden 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.

El ServiceMetadataBehavior utiliza un System.ServiceModel.Description.WsdlExporter para exportar metadatos de todos los puntos de conexión de su servicio. Para obtener más información sobre cómo 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 de 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 accediendo a la Metadata propiedad .

Precaución

Si agrega un punto de conexión MEX en el archivo de configuración de la aplicación e intenta agregar el ServiceMetadataBehavior a su host de servicio en el código, se producirá la siguiente excepción:

System.InvalidOperationException: no se encontró el nombre del contrato 'IMetadataExchange' en la lista de contratos implementados por el servicio Service1. Agregue un ServiceMetadataBehavior al archivo de configuración o directamente a ServiceHost para habilitar la compatibilidad con este contrato.

Para solucionar este problema, puede agregar ServiceMetadataBehavior al archivo de configuración o agregar tanto el endpoint como ServiceMetadataBehavior en el código.

Para obtener un ejemplo de cómo agregar ServiceMetadataBehavior un archivo de configuración de aplicación, consulte Introducción. Para un ejemplo de cómo agregar ServiceMetadataBehavior en código, consulte el ejemplo de Self-Host.

Precaución

Al publicar metadatos para un servicio que expone dos contratos de servicio diferentes en los que cada uno contiene una operación con el mismo nombre, se produce una excepción. Por ejemplo, si tiene 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 produce una excepción o se muestra un mensaje de error al generar los metadatos del servicio. Para solucionar este problema, realice una de las siguientes acciones:

  • 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 servicio

WCF puede recuperar metadatos de servicio mediante protocolos estandarizados, como WS-MetadataExchange y HTTP. Ambos protocolos son compatibles con el MetadataExchangeClient tipo . 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 usado por una System.ServiceModel.Description.MetadataExchangeClient instancia puede ser uno de los enlaces predeterminados de la clase estática MetadataExchangeBindings, un enlace proporcionado por un usuario, o un enlace cargado desde una configuración de punto de conexión para el IMetadataExchange contrato. El System.ServiceModel.Description.MetadataExchangeClient también puede resolver las referencias de dirección URL HTTP a los metadatos mediante el tipo HttpWebRequest.

De forma predeterminada, una System.ServiceModel.Description.MetadataExchangeClient instancia está vinculada a una sola ChannelFactoryBase instancia. Puede cambiar o reemplazar la ChannelFactoryBase instancia usada por un System.ServiceModel.Description.MetadataExchangeClient al invalidar el GetChannelFactory método virtual. Del mismo modo, puede cambiar o reemplazar la System.Net.HttpWebRequest instancia usada por System.ServiceModel.Description.MetadataExchangeClient para realizar solicitudes HTTP/GET invalidando el MetadataExchangeClient.GetWebRequest método virtual.

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 System.ServiceModel.Description.MetadataExchangeClient instancia internamente y carga una configuración de punto de conexión MEX (desde el archivo de configuración de la aplicación) cuyo nombre coincide con el esquema de la dirección pasada a Svcutil.exesi existe. 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 servicio

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

Una System.ServiceModel.Description.MetadataImporter implementación recopila las expresiones de directiva adjuntas a los metadatos del servicio en un PolicyConversionContext objeto . 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 importar nuevas aserciones de directiva a 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. Como alternativa, puede registrar la extensión de importación de directivas en el archivo de configuración de la aplicación cliente.

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

Puede añadir soporte para importar extensiones WSDL implementando la interfaz IWsdlImportExtension y luego agregar su implementación a la propiedad WsdlImportExtensions en 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 se usa para crear un canal a un punto de conexión de servicio en caso de que el enlace para el punto de conexión cambie o desee crear un canal a un punto de conexión que use el mismo contrato, pero que tenga un enlace diferente. Puede usar la MetadataResolver clase estática para recuperar e importar metadatos en tiempo de ejecución para los puntos de conexión de servicio que implementan un contrato específico. A continuación, puede usar los objetos importados System.ServiceModel.Description.ServiceEndpoint para crear un cliente o generador de canales en el punto de conexión deseado.

Consulte también