Partilhar via


IPolicyImportExtension Interface

Definição

Define um método para objetos que importam declarações de políticas personalizadas sobre associações.

public interface class IPolicyImportExtension
public interface IPolicyImportExtension
type IPolicyImportExtension = interface
Public Interface IPolicyImportExtension
Derivado

Exemplos

O exemplo de código a seguir mostra o uso do PolicyAssertionCollection.Remove método para localizar, retornar e remover a asserção em uma etapa.

  #region IPolicyImporter Members
  public const string name1 = "acme";
  public const string ns1 = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions";

  /*
   * Importing policy assertions usually means modifying the bindingelement stack in some way
   * to support the policy assertion. The procedure is:
   * 1. Find the custom assertion to import.
   * 2. Insert a supporting custom bindingelement or modify the current binding element collection
   *     to support the assertion.
   * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned,
   *     any remaining assertions for the binding cause the binding to fail import and not be
   *     constructed.
   */
  public void ImportPolicy(MetadataImporter importer, PolicyConversionContext context)
  {
    Console.WriteLine("The custom policy importer has been called.");
    // 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;
    }
 }
#endregion
    #Region "IPolicyImporter Members"
    Public Const name1 As String = "acme"
    Public Const ns1 As String = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions"

'    
'     * Importing policy assertions usually means modifying the bindingelement stack in some way
'     * to support the policy assertion. The procedure is:
'     * 1. Find the custom assertion to import.
'     * 2. Insert a supporting custom bindingelement or modify the current binding element collection
'     *     to support the assertion.
'     * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned, 
'     *     any remaining assertions for the binding cause the binding to fail import and not be 
'     *     constructed.
'     
    Public Sub ImportPolicy(ByVal importer As MetadataImporter, ByVal context As PolicyConversionContext) Implements IPolicyImportExtension.ImportPolicy
      Console.WriteLine("The custom policy importer has been called.")
      ' 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
    End Sub
  #End Region

O exemplo de código a seguir mostra o arquivo de configuração do aplicativo cliente para carregar o importador de política personalizado quando o System.ServiceModel.Description.MetadataResolver é invocado.

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

O exemplo de código a seguir mostra o uso do MetadataResolver para baixar e resolver metadados em objetos de descrição.

// 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"))

Comentários

Implemente a IPolicyImportExtension interface para pesquisar informações do WSDL expostas por um ponto de extremidade específico para declarações de política personalizadas sobre recursos ou requisitos de ponto de extremidade. Normalmente, um importador de política pesquisa uma declaração específica e insere um elemento de associação, configura um elemento de associação ou modifica o contrato para dar suporte aos requisitos da declaração.

Ao contrário de seu equivalente, IPolicyExportExtension, IPolicyImportExtension não requer implementação por um BindingElement objeto ; você pode carregá-lo usando a seção de configuração do cliente mostrada na seção Exemplos ou programaticamente adicionando-o ao System.ServiceModel.Description.WsdlImporter construtor.

O WCF (Windows Communication Foundation) passa dois objetos para o ImportPolicy método , um MetadataImporter e um PolicyConversionContext. Normalmente, o PolicyConversionContext objeto já contém as declarações de política para cada escopo de associação.

Uma IPolicyImportExtension implementação executa as seguintes etapas:

  1. Localiza a declaração de política personalizada para a qual ela é responsável chamando os GetBindingAssertionsmétodos , GetMessageBindingAssertionsou GetOperationBindingAssertions , dependendo do escopo.

  2. Remove a declaração de política da coleção de declaração. O PolicyAssertionCollection.Remove método localiza, retorna e remove a asserção em uma etapa.

  3. Modifique a pilha de associação ou o contrato adicionando um personalizado BindingElement necessário à BindingElements propriedade ou modificando a PolicyConversionContext.Contract propriedade .

A etapa 2 é importante. Depois que todos os importadores de política forem chamados, o WCF verificará a existência de quaisquer declarações de política que permanecem. Se houver, o WCF pressupõe que a importação da política não foi bem-sucedida e não importa a associação associada.

Importante

Um fornecedor de metadados mal-intencionados pode tentar enviar XML malformado como parte dos metadados na tentativa de explorar um importador de política. É altamente recomendável que os importadores de políticas personalizadas sejam robustos para todas as formas de XML que podem ser passadas para ele.

As implementações personalizadas MetadataImporter devem implementar seu próprio PolicyConversionContext objeto para extrair as declarações de política anexadas ao formato de metadados personalizado.

Se você quiser exportar e importar elementos WSDL personalizados que não são declarações de política, consulte System.ServiceModel.Description.IWsdlExportExtension e System.ServiceModel.Description.IWsdlImportExtension.

Observação

Você pode usar importadores e exportadores de política personalizados com a Ferramenta de Utilitário de Metadados ServiceModel (Svcutil.exe) usando os mesmos elementos de configuração em um arquivo de configuração e a opção /svcutilConfig:<configFile> .

Métodos

ImportPolicy(MetadataImporter, PolicyConversionContext)

Define um método que pode importar declarações de política personalizadas e adicionar elementos de associação de implementação.

Aplica-se a