IPolicyImportExtension Interfaz

Definición

Define un método para los objetos que importan aserciones de directiva personalizadas de los enlaces.

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

Ejemplos

El ejemplo de código siguiente muestra el uso del método PolicyAssertionCollection.Remove para buscar, devolver y quitar la aserción en un paso.

  #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

El ejemplo de código siguiente muestra el archivo de configuración de la aplicación cliente para cargar el importador de directivas personalizado cuando se invoca System.ServiceModel.Description.MetadataResolver.

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

El ejemplo de código siguiente muestra el uso de MetadataResolver para descargar y resolver los metadatos en los objetos de descripción.

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

Comentarios

Implemente la interfaz IPolicyImportExtension para buscar información WSDL expuesta por un punto de conexión determinado para las aserciones de directiva personalizadas sobre capacidades o requisitos del punto de conexión. Normalmente, un importador de directivas busca una aserción concreta y, o bien inserta un elemento de enlace o lo configura, o modifica el contrato para admitir los requisitos de la aserción.

A diferencia de su homólogo, IPolicyExportExtension, IPolicyImportExtension no requiere la implementación por parte de un objeto BindingElement; puede cargarse utilizando la sección de configuración de cliente mostrada en la sección Ejemplos, o mediante programación agregándolo al constructor System.ServiceModel.Description.WsdlImporter.

Windows Communication Foundation (WCF) pasa dos objetos al ImportPolicy método , a MetadataImporter y a PolicyConversionContext. Normalmente, el objeto PolicyConversionContext ya contiene las aserciones de directiva para cada ámbito de enlace.

Una implementación IPolicyImportExtension realiza los pasos siguientes:

  1. Busca la aserción de directiva personalizada de la que es responsable llamando a GetBindingAssertions, GetMessageBindingAssertions, o los métodos GetOperationBindingAssertions, dependiendo del ámbito.

  2. Quita la aserción de directiva especificada de la colección. El método PolicyAssertionCollection.Remove busca, devuelve y quita la aserción en un paso.

  3. Modifique la pila de enlace o el contrato agregando un BindingElement personalizado obligatorio a la propiedad BindingElements, o modificando la propiedad PolicyConversionContext.Contract.

El paso 2 es importante. Después de llamar a todos los importadores de directivas, WCF comprueba la existencia de cualquier aserción de directiva que permanezca. Si existe, WCF supone que la importación de directivas no se realizó correctamente y no importa el enlace asociado.

Importante

Un proveedor de metadatos malintencionado puede intentar enviar XML incorrecto como parte de los metadatos, para aprovecharse de un importador de directivas. Se recomienda encarecidamente que los importadores de directivas personalizados sean resistentes a todos los formularios de XML que puedan pasarles.

Las implementaciones MetadataImporter personalizadas deben implementar su propio objeto PolicyConversionContext para extraer las aserciones de directiva asociadas al formato de metadatos personalizado.

Si desea exportar e importar elementos WSDL personalizados que no son aserciones de la directiva, vea System.ServiceModel.Description.IWsdlExportExtension y System.ServiceModel.Description.IWsdlImportExtension.

Nota

Puede usar importadores y exportadores de directivas personalizados con la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) mediante los mismos elementos de configuración de un archivo de configuración y la /svcutilConfig:<configFile> opción .

Métodos

ImportPolicy(MetadataImporter, PolicyConversionContext)

Define un método que puede importar aserciones de directivas personalizadas y agregar elementos de enlace de implementación.

Se aplica a