Compartir a través de


Información general de la arquitectura de metadatos

Windows Communication Foundation (WCF) proporciona una infraestructura enriquecida para exportar, publicar, recuperar e importar metadatos de servicio. Los servicios de WCF utilizan los metadatos para describir cómo interactuar con los extremos del servicio con el fin de que herramientas, como Svcutil.exe, puedan generar automáticamente el código de cliente para obtener acceso al servicio.

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

WCF utiliza la clase ServiceEndpoint para describir los extremos de un servicio. Puede utilizar WCF para generar metadatos para extremos de servicio o importar metadatos de servicio para generar instancias de ServiceEndpoint.

WCF representa los metadatos de un servicio en forma de una instancia del tipo de MetadataSet, cuya estructura está estrechamente ligada al formato de serialización de metadatos definido 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 System.ServiceModel.Description.MetadataSection.Metadata:

Las instancias de System.ServiceModel.Description.MetadataReference señalan a otro extremo de intercambio de metadatos (MEX) y las instancias de System.ServiceModel.Description.MetadataLocation señalan a un documento de metadatos mediante una dirección URL HTTP. WCF permite usar documentos WSDL para describir extremos de servicio, contratos de servicio, enlaces, modelos de intercambio de mensajes, mensajes y mensajes de error implementados por 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, vea Importación y exportación de esquemas. Puede utilizar WCF para exportar e importar extensiones WSDL para el comportamiento del servicio, comportamientos del contrato y elementos de enlace que extienden la funcionalidad de un servicio. Para obtener más información, vea Exportación de metadatos personalizados para una extensión WCF.

Exportación de metadatos de servicios

En WCF, la exportación de metadatos es el proceso de describir extremos de servicio y proyectarlos en una representación paralela y estandarizada que pueden usar los clientes para entender cómo utilizar 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 incluida 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 extremo, comportamientos del contrato o elementos de enlace en un extremo 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 de WCF publican metadatos mediante la exposición de uno o más extremos 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 extremos de metadatos son similares a otros extremos 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 extremos de metadatos para un servicio de WCF, debe agregar primero una instancia del 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 extremos 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 extremos de metadatos que utilizan el protocolo MEX, agregue extremos de servicio a su host de servicio que utilicen el contrato de servicio denominado IMetadataExchange. WCF define la interfaz IMetadataExchange que tiene este nombre de contrato de servicio. Los extremos de WS-MetadataExchange o los extremos MEX, pueden utilizar uno de los cuatro enlaces predeterminados que los métodos de generador estáticos exponen en la clase MetadataExchangeBindings para coincidir con los enlaces predeterminados utilizados por herramientas de WCF, como Svcutil.exe. También puede configurar extremos de metadatos MEX mediante un enlace personalizado.

ServiceMetadataBehavior utiliza un System.ServiceModel.Description.WsdlExporter para exportar metadatos para todos los extremos de servicio de su servicio. Para obtener más información sobre exportación de metadatos desde un servicio, vea 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 utilizar System.ServiceModel.Description.ServiceMetadataExtension para obtener los metadatos del servicio en tiempo de ejecución mediante la obtención de acceso a la propiedad Metadata.

ms730243.Caution(es-es,VS.100).gifPrecaución:
Si agrega un extremo 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 extremo y ServiceMetadataBehavior en el código.

Para obtener un ejemplo de cómo agregar ServiceMetadataBehavior en un archivo de configuración de aplicación, vea Ejemplo de introducción. Para obtener un ejemplo de cómo agregar ServiceMetadataBehavior en el código, vea el ejemplo Autohospedaje.

ms730243.Caution(es-es,VS.100).gifPrecaució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 normalizados 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 System.ServiceModel.Description.MetadataExchangeClient.GetWebRequest(System.Uri,System.String,System.String).

Puede recuperar metadatos de servicio mediante solicitudes HTTP/GET o WS-MetadataExchange utilizando la herramienta Svcutil.exe y pasando el conmutador /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 extremo 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 sus partes componentes de sus metadatos. Por ejemplo, WCF puede importar instancias deServiceEndpoint, instancias de Binding o instancias de ContractDescription a partir de un documento WSDL para un servicio. Para importar los metadatos del servicio en WCF, utilice 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 incluida en WCF. El tipo System.ServiceModel.Description.WsdlImporter importa metadatos del WSDL con directivas asociadas 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 utilizar la clase estática MetadataResolver para recuperar e importar metadatos en tiempo de ejecución para extremos de servicio que implementan 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 extremo deseado.

Vea también

Referencia

System.ServiceModel.Description

Conceptos

Formatos de metadatos
Exportación e importación de metadatos
Publicación de metadatos
Recuperación de metadatos
Utilización de los metadatos
Security Considerations with Metadata

Otros recursos

Extensión del sistema de metadatos