Compartilhar via


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

  1. Implemente a interface System.ServiceModel.Description.IPolicyImportExtension em uma classe. Consulte os procedimentos a seguir.

  2. Insira o importador de política personalizado por:

  3. Usando um arquivo de configuração. Consulte os procedimentos a seguir.

  4. Usando um arquivo de configuração com a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe). Consulte os procedimentos a seguir.

  5. Inserindo programaticamente o importador de política. Consulte os procedimentos a seguir.

Para implementar a interface System.ServiceModel.Description.IPolicyImportExtension em qualquer classe

  1. 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
    
  2. 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.

  3. 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.

  4. 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

  1. 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>
    
  2. 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

  1. 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.

  2. 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

  1. Adicione o importador à propriedade MetadataImporter.PolicyImportExtensions (por exemplo, se você estiver usando o System.ServiceModel.Description.WsdlImporter) antes de importar os metadados.

Confira também