Importación de metadatos personalizados para una extensión de WCF
En Windows Communication Foundation (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 de un documento WSDL para un servicio. Para importar los metadatos del servicio en WCF, use una implementación de la clase abstracta System.ServiceModel.Description.MetadataImporter. Los tipos que derivan de la clase MetadataImporter implementan la compatibilidad para la importación de formatos de metadatos que se benefician de la lógica de importación de WS-Policy en WCF.
Los metadatos personalizados están compuestos de elementos XML que los importadores de metadatos proporcionados por el sistema no pueden importar. Normalmente, esto incluye extensiones WSDL personalizadas y aserciones de directivas personalizadas.
En esta sección se describe cómo importar extensiones WSDL personalizadas y aserciones de directivas. No se centra en el proceso de importación en sí. Para obtener más información sobre cómo usar los tipos que exportan e importan metadatos independientemente de si dichos metadatos son personalizados o compatibles con el sistema, consulte Exportación e importación de metadatos.
Información general
El tipo System.ServiceModel.Description.WsdlImporter es la implementación de la clase abstracta MetadataImporter que se incluye en WCF. El tipo WsdlImporter importa metadatos del WSDL con directivas adjuntas que se empaquetan en un objeto System.ServiceModel.Description.MetadataSet. Las aserciones de directivas y las extensiones WSDL que los importadores predeterminados no reconocen se pasan a cualquier directiva personalizada registrada e importadores del WSDL para su importación. Normalmente, los importadores se implementan para admitir los elementos de enlace definidos por el usuario o para modificar el contrato importado.
En esta sección se describe:
Cómo implementar y utilizar la interfaz System.ServiceModel.Description.IWsdlImportExtension, que expone los datos de WSDL a los importadores personalizados antes de la generación de descripciones y la generación de código. Puede utilizar esta interfaz para examinar o modificar los tipos de descripción y codificar la compilación realizada utilizando un conjunto determinado de metadatos.
Cómo implementar y utilizar la interfaz System.ServiceModel.Description.IPolicyImportExtension, que expone aserciones de directivas a importadores antes de la generación de objetos de descripción. Puede utilizar esta interfaz para examinar o modificar el enlace o el contrato basado en las directivas descargadas.
Para obtener más información sobre la exportación de aserciones de directivas y WSDL personalizadas, consulte Exportación de metadatos personalizados para una extensión WCF.
Importación de las extensiones WSDL personalizadas
Para agregar la compatibilidad para la importación de extensiones WSDL, implemente la interfaz IWsdlImportExtension y, a continuación, agregue su implementación a la propiedad WsdlImportExtensions. WsdlImporter también puede cargar las implementaciones de la interfaz IWsdlImportExtension registradas en su archivo de configuración de la aplicación. Observe que se registran varios importadores de WSDL de forma predeterminada y el orden de los importadores de WSDL registrados es significativo.
Cuando WsdlImporter carga y utiliza el importador de WSDL personalizado, primero se llama al método BeforeImport para habilitar la modificación de metadatos antes del proceso de importación. Después, se importan los contratos después de que el método ImportContract se llame para habilitar la modificación de los contratos importados desde los metadatos. Finalmente, se llama al método ImportEndpoint para habilitar la modificación de puntos de conexión importados.
Para obtener más información, consulte Procedimiento para importar WSDL personalizado.
Importación de aserciones de directivas personalizadas
El tipo WsdlImporter y la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) controlan de forma automática el procesamiento de una variedad de tipos de aserciones de directivas en expresiones de directivas adjuntas a documentos WSDL. Estas herramientas recogen, normalizan y combinan expresiones de directivas adjuntas a los enlaces de WSDL y puertos WSDL.
Para agregar compatibilidad para la importación de aserciones de directivas personalizadas, implemente la interfaz IPolicyImportExtension y, a continuación, agregue su implementación a la propiedad PolicyImportExtensions. MetadataImporter también puede cargar las implementaciones de la interfaz IPolicyImportExtension registradas en su archivo de configuración de la aplicación. Observe que se registran varios importadores de directivas de forma predeterminada y el orden de los importadores de directivas registradas es significativo.
El sistema de metadatos llama repetidamente al método IPolicyImportExtension.ImportPolicy en todas las extensiones de importación de directivas registradas para cada combinación de alternativas de directivas adjuntas al mensaje, operación y asuntos de directivas de puntos de conexión. Al importar un puerto WSDL, las directivas adjuntas al puerto y al enlace WSDL correspondiente se combinan antes de llamar en las extensiones de importación de directivas. Las alternativas de directivas se ponen a disposición a través de PolicyConversionContext como objetos PolicyAssertionCollection. Cada PolicyAssertionCollection es una colección de aserciones de directivas representada por objetos XmlElement.
Las propiedades Contract y BindingElements en el objeto PolicyConversionContext exponen ContractDescription y los objetos BindingElement que se importaron desde WSDL. Las extensiones de importación de directivas procesan aserciones de directivas encontrando instancias de un tipo de aserción de directiva determinado, realizando los cambios correspondientes en los objetos ContractDescription o BindingElement y quitando, a continuación, las aserciones de directivas de la instancia PolicyAssertionCollection correspondiente.
El atributo wsp:Optional
y las expresiones de directivas anidadas no se normalizan, por lo que las extensiones de importación deben controlar estas construcciones de directivas. Asimismo, las extensiones de importación de directivas puede llamarse varias veces con los mismos objetos ContractDescription y BindingElement, de modo que las extensiones de importación de directivas deberían ser robustas para este comportamiento.
Importante
Los metadatos no válidos o inadecuados pueden pasarse al importador. Asegúrese de que los importadores personalizados son robustos para todos los formularios de XML.