Importando metadados personalizados para uma extensão WCF
No Windows Communication Foundation (WCF), a importação de metadados é o processo de gerar uma representação abstrata de um serviço ou de suas partes componentes a partir de seus metadados. Por exemplo, o WCF pode importar ServiceEndpoint instâncias, Binding instâncias ou ContractDescription instâncias de um documento WSDL para um serviço. Para importar metadados de serviço no WCF, use uma implementação da System.ServiceModel.Description.MetadataImporter classe abstrata. Os tipos que derivam da classe implementam suporte MetadataImporter para importar formatos de metadados que aproveitam a lógica de importação WS-Policy no WCF.
Os metadados personalizados consistem em elementos XML que os importadores de metadados fornecidos pelo sistema não podem importar. Normalmente, isso inclui extensões WSDL personalizadas e asserções de política personalizadas.
Esta seção descreve como importar extensões WSDL personalizadas e asserções de política. Não se concentra 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.
Descrição geral
O System.ServiceModel.Description.WsdlImporter tipo é a implementação da MetadataImporter classe abstrata incluída no WCF. O WsdlImporter tipo importa metadados WSDL com políticas anexadas que são agrupadas em um System.ServiceModel.Description.MetadataSet objeto. Asserçõ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. Normalmente, os importadores são implementados para dar suporte a elementos de vinculação definidos pelo usuário ou para modificar o contrato importado.
Esta secção descreve:
Como implementar e usar a System.ServiceModel.Description.IWsdlImportExtension interface, que expõe os dados 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 System.ServiceModel.Description.IPolicyImportExtension interface, que expõe asserçõ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 vinculação ou o contrato com base nas políticas baixadas.
Para obter mais informações sobre como exportar WSDL personalizado e asserções de política, consulte Exportando metadados personalizados para uma extensão WCF.
Importando extensões WSDL personalizadas
Para adicionar suporte à importação de extensões WSDL, implemente a IWsdlImportExtension interface e adicione sua implementação à WsdlImportExtensions propriedade. O WsdlImporter também pode carregar implementações da interface registrada em seu arquivo de configuração do IWsdlImportExtension 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 BeforeImport método é chamado para habilitar a modificação de metadados antes do processo de importação. Em seguida, os contratos são importados, após o que o ImportContract método é chamado para permitir a modificação dos contratos importados dos metadados. Finalmente, o ImportEndpoint método é chamado para permitir a modificação dos pontos de extremidade importados.
Para obter mais informações, consulte Como importar WSDL personalizado.
Importando asserções de política personalizada
O WsdlImporter tipo e a ServiceModel Metadata Utility Tool (Svcutil.exe) lidam automaticamente com o processamento de uma variedade de tipos de asserçã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 para importar asserções de política personalizadas, implemente a IPolicyImportExtension interface e, em seguida, adicione sua implementação à PolicyImportExtensions propriedade. O MetadataImporter também pode carregar implementações da interface registrada em seu arquivo de configuração do IPolicyImportExtension aplicativo. Observe que vários importadores de apólices são registrados por padrão e a ordem dos importadores de apólices registrados é significativa.
O sistema de metadados chama repetidamente o IPolicyImportExtension.ImportPolicy método em todas as extensões de importação de política registradas para cada combinação de alternativas de política anexadas aos assuntos da política de mensagem, operação e ponto final. 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 políticas são disponibilizadas através de um PolicyConversionContext como PolicyAssertionCollection objeto. Cada PolicyAssertionCollection um é uma coleção de asserções de política representadas por XmlElement objetos.
As Contract propriedades e BindingElements no PolicyConversionContext objeto expõem os ContractDescription objetos e BindingElement que foram importados do WSDL. As extensões de importação de política processam asserções de política localizando instâncias de um tipo de asserção de política específico, fazendo alterações correspondentes nos ContractDescription objetos ou BindingElement e, em seguida, removendo as asserções de política da instância correspondente PolicyAssertionCollection .
O atributo e as wsp:Optional
expressões de política aninhadas não são normalizados, portanto, as extensões de importação de política devem lidar com essas construções de política. Além disso, as extensões de importação de política podem ser chamadas várias vezes com os mesmos ContractDescription objetos e BindingElement , portanto, as extensões de importação de política devem ser robustas para esse comportamento.
Importante
Metadados inválidos ou impróprios podem ser passados ao importador. Certifique-se de que os importadores personalizados sejam robustos para todas as formas de XML.