Partilhar via


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

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

  2. Insira o importador de política personalizada da seguinte forma:

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

  4. Usando um arquivo de configuração com ServiceModel Metadata Utility Tool (Svcutil.exe). Consulte os procedimentos a seguir.

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

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

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

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

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

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

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

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

Consulte também