IPolicyImportExtension Interface

Definição

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

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

Exemplos

O seguinte exemplo de código mostra o uso do PolicyAssertionCollection.Remove método para localizar, devolver e remover a asserção num só passo.

  #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 seguinte mostra que o ficheiro de configuração da aplicação cliente carrega o importador de políticas personalizadas quando é 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 seguinte mostra a utilização do MetadataResolver para descarregar 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"))

Observações

Implemente a IPolicyImportExtension interface para pesquisar informação WSDL exposta por um endpoint específico para afirmações de políticas personalizadas sobre capacidades ou requisitos do endpoint. Normalmente, um importador de apólices procura uma afirmação específica e insere um elemento vinculante, configura um elemento vinculativo ou modifica o contrato para suportar os requisitos da afirmação.

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

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

Uma IPolicyImportExtension implementação executa os seguintes passos:

  1. Localiza a asserção de política personalizada pela qual é responsável chamando os GetBindingAssertionsmétodos , GetMessageBindingAssertions, ou GetOperationBindingAssertions os métodos, dependendo do âmbito.

  2. Remove a afirmação da política da coleção de afirmações. O PolicyAssertionCollection.Remove método localiza, devolve e remove a afirmação num só passo.

  3. Modificar a pilha vinculativa ou o contrato adicionando um costume BindingElement obrigatório à BindingElements propriedade ou modificando a PolicyConversionContext.Contract propriedade.

O passo 2 é importante. Depois de todos os importadores de apólices terem sido chamados, a WCF verifica a existência de quaisquer afirmações de política que permaneçam. Se existir uma, a WCF assume que a importação da política não teve sucesso e não importa a ligação associada.

Importante

Um fornecedor malicioso de metadados pode tentar enviar XML malformado como parte de metadados numa tentativa de explorar um importador de políticas. É fortemente recomendado que os importadores de políticas personalizadas sejam robustos a todas as formas de XML que possam ser transmitidas para eles.

Implementações personalizadas MetadataImporter devem implementar o seu próprio PolicyConversionContext objeto para extrair as asserções de política associadas ao formato de metadados personalizado.

Se quiser exportar e importar elementos WSDL personalizados que não sejam asserções de políticas, veja System.ServiceModel.Description.IWsdlExportExtension e System.ServiceModel.Description.IWsdlImportExtension.

Note

Pode usar importadores e exportadores de políticas personalizados com a Ferramenta Utilitária de Metadados do Modelo de Serviço (Svcutil.exe) usando os mesmos elementos de configuração num ficheiro de configuração e a /svcutilConfig:<configFile> opção.

Métodos

Name Description
ImportPolicy(MetadataImporter, PolicyConversionContext)

Define um método que pode importar asserções de políticas personalizadas e adicionar elementos de ligação de implementação.

Aplica-se a