Importando metadados personalizados para uma extensão do WCF
No WCF (Windows Communication Foundation), a importação de metadados é o processo de geração de uma representação abstrata de um serviço ou de suas partes componentes de seus metadados. Por exemplo, o WCF pode importar instâncias ServiceEndpoint, Binding ou ContractDescription de um documento WSDL para um serviço. Para importar metadados de serviço no WCF, use uma implementação de classe abstrata System.ServiceModel.Description.MetadataImporter. Tipos que derivam da classe MetadataImporter implementam suporte para importação de formatos de metadados que aproveitam a lógica de importação WS-Policy no WCF.
Metadados personalizados consistem em elementos XML que os importadores de metadados fornecidos pelo sistema não podem importar. Normalmente, inclui extensões WSDL personalizadas e declarações de política personalizadas.
Esta seção descreve como importar extensões de WSDL personalizadas e declarações de política. A seção não foca no processo de importação em si. Para obter mais informações sobre como usar os tipos que exportam e importam metadados, independentemente de os metadados serem personalizados ou suportados pelo sistema, consulte Exportando e importando metadados.
Visão geral
O tipo System.ServiceModel.Description.WsdlImporter é a implementação da classe abstrata MetadataImporter incluída no WCF. O tipo WsdlImporter importa metadados WSDL com políticas anexadas que são empacotadas em um objeto System.ServiceModel.Description.MetadataSet. Declarações de política e extensões WSDL que os importadores padrão não reconhecem são passadas para qualquer política personalizada registrada e importadores WSDL para importação. Geralmente, os importadores são implementados para oferecer suporte a elementos de associação definidos pelo usuário ou modificar o contrato importado.
Esta seção descreve:
Como implementar e usar a interface System.ServiceModel.Description.IWsdlImportExtension, que mostra os dados do WSDL a importadores personalizados antes da geração de descrições e da geração de código. Você pode usar essa interface para examinar ou modificar os tipos de descrição e a compilação de código executada usando um determinado conjunto de metadados.
Como implementar e usar a interface System.ServiceModel.Description.IPolicyImportExtension, que mostra declarações de política aos importadores antes da geração de objetos de descrição. Você pode usar essa interface para examinar ou modificar a associação ou o contrato com base nas políticas baixadas.
Para obter mais informações sobre como exportar declarações de política e WSDL personalizadas, consulte Exportar metadados personalizados para uma extensão WCF.
Importando extensões WSDL personalizadas
Para adicionar suporte para importar extensões WSDL, implemente a interface IWsdlImportExtension e adicione sua implementação à propriedade WsdlImportExtensions. WsdlImporter pode também carregar implementações da interface IWsdlImportExtension registrada no arquivo de configuração do aplicativo. Observe que vários importadores WSDL são registrados por padrão e a ordem dos importadores WSDL registrados é significativa.
Quando o importador WSDL personalizado é carregado e usado pelo WsdlImporter, primeiro o método BeforeImport é chamado para habilitar a modificação de metadados antes do processo de importação. Em seguida, os contratos são importados após o qual o método ImportContract é chamado para habilitar a modificação dos contratos importados dos metadados. Por fim, o método ImportEndpoint é chamado para habilitar a modificação dos pontos de extremidade importados.
Para obter mais informações, consulte Como importar o WSDL personalizado.
Importar declarações de política personalizadas
O tipo WsdlImporter e a ferramenta do utilitário de metadados ServiceModel (Svcutil.exe) tratam automaticamente do processamento de diversos tipos de declaração de política em expressões de política anexadas a documentos WSDL. Essas ferramentas coletam, normalizam e mesclam expressões de política anexadas a associações WSDL e portas WSDL.
Para adicionar suporte a importação de declarações de política, implemente a interface IPolicyImportExtension e adicione sua implementação à propriedade PolicyImportExtensions. MetadataImporter também pode carregar implementações da interface IPolicyImportExtension registrada no arquivo de configuração de aplicativo. Observe que vários importadores da política são registrados por padrão e a ordem dos importadores da política registrados é significativa.
O sistema de metadados chama repetidamente o método IPolicyImportExtension.ImportPolicy em todas as extensões de importação de política registradas para cada combinação de alternativas de política anexadas às mensagens, operações e questões de ponto de extremidade. Ao importar uma porta WSDL, as políticas anexadas à porta e à associação WSDL correspondente são mescladas antes de chamar as extensões de importação de política. As alternativas de política estão disponíveis por meio de objetos PolicyConversionContext como PolicyAssertionCollection. Cada PolicyAssertionCollection é uma coleção de declarações de política representadas por objetos XmlElement.
As propriedades Contract e BindingElements no objeto PolicyConversionContext mostram os objetos ContractDescription e BindingElement que foram importados do WSDL. As extensões de importação de política processam declarações de política pela identificação de instâncias de um tipo de declaração de política específico, pelas alterações correspondentes aos objetos ContractDescription ou BindingElement, em seguida, a remoção das declarações de política da instância PolicyAssertionCollectioncorrespondente.
O atributo wsp:Optional
e as expressões de política aninhadas não são normalizados, portanto, as extensões de importação de política devem lidar com esses constructos de política. Além disso, as extensões de importação de política podem ser chamadas várias vezes com os mesmos objetos ContractDescription e BindingElement, portanto, as extensões de importação de política devem ser robustas para esse comportamento.
Importante
Metadados inválidos ou inadequados podem ser passados para o importador. Verifique se os importadores personalizados são robustos para todas as formas de XML.