Compartir a través de


Cómo: 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 extremo 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 predeterminado.

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. Uso de un archivo de configuración con 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 System.ServiceModel.Description.IPolicyImportExtension.ImportPolicy(System.ServiceModel.Description.MetadataImporter,System.ServiceModel.Description.PolicyConversionContext), 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 System.ServiceModel.Description.PolicyAssertionCollection.Remove(System.String,System.String) 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.
    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
    
    // 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;
    }
    
  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 System.ServiceModel.Description.PolicyConversionContext.BindingElements. Otras aserciones requieren que modifique el contrato. Puede obtener acceso y modificar el contrato mediante la propiedad System.ServiceModel.Description.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 elimina la aserción, Windows Communication Foundation (WCF) supone que la importación de la directiva no se realizó correctamente y no importa el enlace asociado. Si usó el método System.ServiceModel.Description.PolicyAssertionCollection.Remove(System.String,System.String) 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><policyImporters> dentro del elemento en el archivo de configuración del cliente.

    <client>
        <endpoint 
          address="https://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. 
    Dim endpoints As ServiceEndpointCollection = MetadataResolver.Resolve(GetType(IStatefulService), New EndpointAddress("https://localhost:8080/StatefulService/mex"))
    
    // Download all metadata. 
    ServiceEndpointCollection endpoints
      = MetadataResolver.Resolve(
        typeof(IStatefulService),
        new EndpointAddress("https://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><policyImporters> dentro del elemento 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. Utilice Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para importar los metadatos y se invoca el importador automáticamente.

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

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

Vea también

Referencia

System.ServiceModel.Description.MetadataResolver
System.ServiceModel.Description.WsdlImporter
System.ServiceModel.Description.MetadataResolver

Otros recursos

Extensión del sistema de metadatos