Como: Importar asserções de política personalizada
As asserções de política descrevem os recursos e os requisitos de um ponto de extremidade de serviço. Os aplicativos cliente podem usar asserções de política em metadados de serviço para configurar a associação de cliente ou para personalizar o contrato de serviço para um ponto de extremidade de serviço.
As asserções de política personalizadas são importadas implementando a System.ServiceModel.Description.IPolicyImportExtension interface e passando esse objeto para o sistema de metadados ou registrando o tipo de implementação no arquivo de configuração do aplicativo. As implementações da IPolicyImportExtension interface devem fornecer um construtor sem parâmetros.
Para importar asserções de política personalizada
Implemente a System.ServiceModel.Description.IPolicyImportExtension interface em uma classe. Consulte os procedimentos a seguir.
Insira o importador de política personalizada da seguinte forma:
Usando um arquivo de configuração. Consulte os procedimentos a seguir.
Usando um arquivo de configuração com ServiceModel Metadata Utility Tool (Svcutil.exe). Consulte os procedimentos a seguir.
Inserção programática do importador de políticas. Consulte os procedimentos a seguir.
Para implementar a interface System.ServiceModel.Description.IPolicyImportExtension em qualquer classe
IPolicyImportExtension.ImportPolicy No método, para cada assunto de política em que você está interessado, localize as asserções de política que você deseja importar chamando o método apropriado (dependendo do escopo da asserção desejada) no System.ServiceModel.Description.PolicyConversionContext objeto passado para o método. O exemplo de código a seguir mostra como usar o PolicyAssertionCollection.Remove método 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 asserção, não será necessário 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
Processar as asserções políticas. Observe que o sistema de políticas não normaliza políticas aninhadas e
wsp:optional
. Você deve processar essas construções em sua implementação de extensão de importação de política.Execute a personalização para a associação ou contrato que suporta a capacidade ou requisito especificado pela declaração de política. Normalmente, as asserções indicam que uma ligação requer uma configuração específica ou um elemento de ligação específico. Faça essas modificações acessando a PolicyConversionContext.BindingElements propriedade. Outras afirmações exigem que você modifique o contrato. Você pode acessar e modificar o contrato usando a PolicyConversionContext.Contract propriedade. Observe que o importador da apólice pode ser chamado várias vezes para a mesma vinculaçã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 asserção de política personalizada da coleção de asserção. Se você não remover a asserção, o Windows Communication Foundation (WCF) assumirá que a importação de diretiva não foi bem-sucedida e não importará a associação associada. Se você usou o PolicyAssertionCollection.Remove método para localizar a declaração de política personalizada e removê-la da coleção em uma etapa, não é necessário executar essa etapa.
Para inserir o importador de política personalizada no sistema de metadados usando um arquivo de configuração
Adicione o tipo de importador ao
<extensions>
elemento 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 é 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 personalizada no sistema de metadados usando Svcutil.exe
Adicione o tipo de importador ao
<extensions>
elemento dentro do <elemento policyImporters> no arquivo de configuração Svcutil.exe.config. Você também pode apontar Svcutil.exe para carregar tipos de importador de política registrados em um arquivo de configuração diferente usando a/svcutilConfig
opção.Use ServiceModel Metadata Utility Tool (Svcutil.exe) para importar os metadados e o importador é invocado automaticamente.
Para inserir o importador de política personalizada no sistema de metadados programaticamente
- Adicione o importador à MetadataImporter.PolicyImportExtensions propriedade (por exemplo, se você estiver usando o System.ServiceModel.Description.WsdlImporter) antes de importar os metadados.