Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Interfaz IPolicyImportExtension

 

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

Espacio de nombres:   System.ServiceModel.Description
Ensamblado:  System.ServiceModel (en System.ServiceModel.dll)

public interface IPolicyImportExtension

NombreDescripción
System_CAPS_pubmethodImportPolicy(MetadataImporter, PolicyConversionContext)

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

Implemente la interfaz IPolicyImportExtension para buscar información WSDL expuesta por un extremo determinado para las aserciones de directiva personalizadas sobre capacidades o requisitos del extremo. 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 método ImportPolicy, un MetadataImporter y un 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. Una vez llamados todos los importadores de la directiva, WCF comprueba la existencia de cualquier aserción de directiva. Si existe una, WCF supone que la importación de la directiva fue incorrecta y que no se importó el enlace asociado.

System_CAPS_importantImportante

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.

System_CAPS_noteNota

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

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

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.

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

.NET Framework
Disponible desde 3.0
Volver al principio
Mostrar: