Como: importar declarações de política personalizadas
As declarações de política descrevem os recursos e os requisitos de um ponto de extremidade de serviço. Os aplicativos cliente podem usar declarações de política em metadados de serviço para configurar a associação do cliente ou personalizar o contrato de serviço para um ponto de extremidade de serviço.
As declarações de política personalizadas são importadas implementando a interface System.ServiceModel.Description.IPolicyImportExtension e passando o objeto para o sistema de metadados ou registrando o tipo de implementação no arquivo de configuração do aplicativo. As implementações da interface IPolicyImportExtension devem fornecer um construtor sem parâmetros.
Para importar declarações de política personalizadas
Implemente a interface System.ServiceModel.Description.IPolicyImportExtension em uma classe. Consulte os procedimentos a seguir.
Insira o importador de política personalizado por:
Usando um arquivo de configuração. Consulte os procedimentos a seguir.
Usando um arquivo de configuração com a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe). Consulte os procedimentos a seguir.
Inserindo programaticamente o importador de política. Consulte os procedimentos a seguir.
Para implementar a interface System.ServiceModel.Description.IPolicyImportExtension em qualquer classe
No método IPolicyImportExtension.ImportPolicy, para cada assunto de política no qual você está interessado, localize as declarações de política que deseja importar chamando o método apropriado (dependendo do escopo da declaração desejada) no objeto System.ServiceModel.Description.PolicyConversionContext passado para o método. O exemplo de código a seguir mostra como usar o método PolicyAssertionCollection.Remove para localizar a declaração de política personalizada e removê-la da coleção em uma etapa. Se você usar o método remove para localizar e remover a declaração, não precisará executar a etapa 4.
// Locate the custom assertion and remove it. XmlElement customAssertion = context.GetBindingAssertions().Remove(name1, ns1); if (customAssertion != null) { Console.WriteLine( "Removed our custom assertion from the imported " + "assertions collection and inserting our custom binding element." ); // Here we would add the binding modification that implemented the policy. // This sample does not do this. Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(customAssertion.NamespaceURI + " : " + customAssertion.Name); Console.WriteLine(customAssertion.OuterXml); Console.ForegroundColor = ConsoleColor.Gray; }
' Locate the custom assertion and remove it. Dim customAssertion As XmlElement = context.GetBindingAssertions().Remove(name1, ns1) If customAssertion IsNot Nothing Then Console.WriteLine("Removed our custom assertion from the imported " & "assertions collection and inserting our custom binding element.") ' Here we would add the binding modification that implemented the policy. ' This sample does not do this. Console.ForegroundColor = ConsoleColor.Red Console.WriteLine(customAssertion.NamespaceURI & " : " & customAssertion.Name) Console.WriteLine(customAssertion.OuterXml) Console.ForegroundColor = ConsoleColor.Gray End If
Processe as declarações de política. Observe que o sistema de política não normaliza políticas aninhadas e
wsp:optional
. Você deve processar esses constructos em sua implementação de extensão de importação de política.Execute a personalização para a associação ou contrato que dá suporte à funcionalidade ou ao requisito especificado pela declaração de política. Normalmente, as declarações indicam que uma associação requer uma configuração específica ou um elemento de associação específico. Faça essas modificações acessando a propriedade PolicyConversionContext.BindingElements. Outras declarações exigem que você modifique o contrato. Você pode acessar e modificar o contrato usando a propriedade PolicyConversionContext.Contract. Observe que o importador de política pode ser chamado várias vezes para a mesma associação e contrato, mas alternativas de política diferentes se a importação de uma alternativa de política falhar. Seu código deve ser resiliente a esse comportamento.
Remova a declaração de política personalizada da coleção de declarações. Se você não remover a declaração, o WCF (Windows Communication Foundation) pressupõe que a importação de política não foi bem-sucedida e não importa a associação associada. Se você usou o método PolicyAssertionCollection.Remove para localizar a declaração de política personalizada e removê-la da coleção em uma etapa, não precisará executar esta etapa.
Para inserir o importador de política personalizado no sistema de metadados usando um arquivo de configuração
Adicione o tipo de importador ao elemento
<extensions>
dentro do elemento <policyImporters> no arquivo de configuração do cliente.<client> <endpoint address="http://localhost:8080/StatefulService" binding="wsHttpBinding" bindingConfiguration="CustomBinding_IStatefulService" contract="IStatefulService" name="CustomBinding_IStatefulService" /> <metadata> <policyImporters> <extension type="Microsoft.WCF.Documentation.CustomPolicyImporter, PolicyExtensions"/> </policyImporters> </metadata> </client>
No aplicativo cliente, use o System.ServiceModel.Description.MetadataResolver ou System.ServiceModel.Description.WsdlImporter para resolver os metadados e o importador será invocado automaticamente.
// Download all metadata. ServiceEndpointCollection endpoints = MetadataResolver.Resolve( typeof(IStatefulService), new EndpointAddress("http://localhost:8080/StatefulService/mex") );
' Download all metadata. Dim endpoints As ServiceEndpointCollection = MetadataResolver.Resolve(GetType(IStatefulService), New EndpointAddress("http://localhost:8080/StatefulService/mex"))
Para inserir o importador de política personalizado no sistema de metadados usando o Svcutil.exe
Adicione o tipo de importador ao elemento
<extensions>
dentro do elemento <policyImporters> no arquivo de configuração do Svcutil.exe. Você também pode apontar o Svcutil.exe para carregar tipos de importadores de política registrados em um arquivo de configuração diferente usando a opção/svcutilConfig
.Use a Ferramenta do Utilitário de Metadados do ServiceModel (Svcutil.exe) para importar os metadados e o importador será invocado automaticamente.
Para inserir o importador de política personalizado no sistema de metadados programaticamente
- Adicione o importador à propriedade MetadataImporter.PolicyImportExtensions (por exemplo, se você estiver usando o System.ServiceModel.Description.WsdlImporter) antes de importar os metadados.