Compartir a través de


Procedimiento para importar aserciones de directivas personalizadas

Las aserciones de directivas describen las funciones y requisitos de un extremo de servicio. Las aplicaciones cliente pueden utilizar aserciones de directivas en metadatos del servicio para configurar el enlace de cliente o para personalizar el contrato de servicio de un punto de conexión de servicio.

Las aserciones de directiva personalizadas se importan implementando la interfaz System.ServiceModel.Description.IPolicyImportExtension y pasando ese objeto al sistema de los metadatos o registrando el tipo de implementación en su archivo de configuración de la aplicación. Las implementaciones de la interfaz IPolicyImportExtension deben proporcionar un constructor sin parámetros.

Para importar aserciones de directivas personalizadas

  1. Implemente la interfaz System.ServiceModel.Description.IPolicyImportExtension en una clase. Consulte los procedimientos siguientes.

  2. Insertar el importador de directivas personalizadas mediante:

  3. El uso de un archivo de configuración Consulte los procedimientos siguientes.

  4. El uso de un archivo de configuración con la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe). Consulte los procedimientos siguientes.

  5. Insertar mediante programación el importador de la directiva. Consulte los procedimientos siguientes.

Para implementar la interfaz System.ServiceModel.Description.IPolicyImportExtension en cualquier clase

  1. En el método IPolicyImportExtension.ImportPolicy, para cada asunto de la directiva en la que esté interesado, busque las aserciones de directiva que desee importar llamando al método adecuado (dependiendo del ámbito de la aserción que desee) en el objeto System.ServiceModel.Description.PolicyConversionContext pasado al método. El ejemplo de código siguiente muestra cómo utilizar el método PolicyAssertionCollection.Remove para ubicar la aserción de directiva personalizada y quitarla de la colección en un paso. Si utiliza el método de eliminación para buscar y quitar la aserción, no tiene que realizar el paso 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. Procese las aserciones de directiva. Tenga en cuenta que el sistema de la directiva no normaliza directivas anidadas y wsp:optional. Debe procesar estas construcciones en su implementación de extensión de importación de directivas.

  3. Realice la personalización para el enlace o contrato que admite la función o el requisito especificó por la aserción de directiva. Normalmente las aserciones indican que un enlace requiere una configuración determinada o un elemento de enlace concreto. Realice estas modificaciones obteniendo acceso a la propiedad PolicyConversionContext.BindingElements. Otras aserciones requieren que modifique el contrato. Puede obtener acceso y modificar el contrato mediante la propiedad PolicyConversionContext.Contract. Observe que su importador de directivas se puede llamar varias veces para el mismo enlace y contrato, pero para alternativas de directivas diferentes si no se importa correctamente una alternativa de directivas. Su código debería ser resistente a este comportamiento.

  4. Elimine la aserción de directiva personalizada de la colección de aserciones. Si no quita la aserción, Windows Communication Foundation (WCF) asumirá que la importación de la directiva no se realizó correctamente y no importará el enlace asociado. Si usó el método PolicyAssertionCollection.Remove para ubicar la aserción de directivas personalizadas y eliminarla de la colección en un paso no tiene que realizar este paso.

Para insertar el importador de directivas personalizadas en el sistema de metadatos utilizando un archivo de configuración

  1. Agregue el tipo de importador al elemento <extensions> dentro del elemento <policyImporters> en el archivo de configuración del 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. En la aplicación cliente, utilice System.ServiceModel.Description.MetadataResolver o System.ServiceModel.Description.WsdlImporter para resolver los metadatos y se invoca automáticamente el importador.

    // 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 insertar el importador de directivas personalizadas en el sistema de metadatos utilizando Svcutil.exe

  1. Agregue el tipo de importador al elemento <extensions> dentro del elemento <policyImporters> en el archivo de configuración Svcutil.exe.config. También puede señalar Svcutil.exe para cargar tipos de importador de directivas registrados en un archivo de configuración diferente mediante la opción /svcutilConfig.

  2. Use la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para importar los metadatos y el importador se invocará de forma automática.

Para insertar mediante programación el importador de directivas personalizadas en el sistema de metadatos

  1. Agregue el importador a la propiedad MetadataImporter.PolicyImportExtensions(por ejemplo, si está utilizando ) System.ServiceModel.Description.WsdlImporter antes de importar los metadatos.

Consulte también