Guide pratique pour importer des assertions de stratégie personnalisée

Les assertions de stratégie décrivent les fonctionnalités et les exigences d’un point de terminaison de service. Les applications clientes peuvent utiliser des assertions de stratégie dans les métadonnées de service pour configurer la liaison du client ou personnaliser le contrat de service pour un point de terminaison de service.

Les assertions de stratégie personnalisées sont importées en implémentant l’interface System.ServiceModel.Description.IPolicyImportExtension et en transmettant cet objet au système de métadonnées ou en inscrivant le type d’implémentation dans votre fichier de configuration d’application. Les implémentations de l’interface IPolicyImportExtension doivent fournir un constructeur sans paramètre.

Pour importer des assertions de stratégie personnalisées

  1. Implémentez l’interface System.ServiceModel.Description.IPolicyImportExtension sur une classe. Consultez les procédures suivantes.

  2. Insérez l’importateur de stratégie personnalisé soit par :

  3. Utilisation d’un fichier de configuration. Consultez les procédures suivantes.

  4. Utilisation d’un fichier de configuration avec l’outil utilitaire de métadonnées ServiceModel (Svcutil.exe). Consultez les procédures suivantes.

  5. Insertion programmatique de l’importateur de stratégie. Consultez les procédures suivantes.

Pour implémenter l’interface System.ServiceModel.Description.IPolicyImportExtension sur n’importe quelle classe

  1. Dans la IPolicyImportExtension.ImportPolicy méthode, pour chaque sujet de stratégie qui vous intéresse, recherchez les assertions de stratégie que vous souhaitez importer en appelant la méthode appropriée (selon l’étendue de l’assertion souhaitée) sur l’objet System.ServiceModel.Description.PolicyConversionContext passé à la méthode. L’exemple de code suivant montre comment utiliser la PolicyAssertionCollection.Remove méthode pour localiser l’assertion de stratégie personnalisée et la supprimer de la collection en une seule étape. Si vous utilisez la méthode remove pour localiser et supprimer l’assertion, vous n’avez pas besoin d’effectuer l’étape 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. Traitez les assertions de stratégie. Notez que le système de stratégie ne normalise pas les stratégies imbriquées et wsp:optional. Vous devez traiter ces éléments dans l’implémentation de l’extension d’importation de politiques.

  3. Effectuez la personnalisation de la liaison ou du contrat qui prend en charge la fonctionnalité ou l'exigence spécifiée par l'assertion de politique. En règle générale, les assertions indiquent qu’une liaison nécessite une configuration particulière ou un élément de liaison spécifique. Apportez ces modifications en accédant à la PolicyConversionContext.BindingElements propriété. D’autres assertions nécessitent de modifier le contrat. Vous pouvez accéder au contrat et le modifier à l’aide de la PolicyConversionContext.Contract propriété. Notez que votre importateur de stratégie peut être appelé plusieurs fois pour la même liaison et le même contrat, mais différentes alternatives de stratégie si l’importation d’une alternative de stratégie échoue. Votre code doit être résilient à ce comportement.

  4. Supprimez l’assertion de stratégie personnalisée de la collection d’assertions. Si vous ne supprimez pas l’assertion, Windows Communication Foundation (WCF) supposera que l’importation de stratégie a échoué et n’importera pas la liaison associée. Si vous avez utilisé la PolicyAssertionCollection.Remove méthode pour localiser l’assertion de stratégie personnalisée et la supprimer de la collection en une seule étape, vous n’avez pas besoin d’effectuer cette étape.

Pour insérer l’importateur de stratégie personnalisé dans le système de métadonnées à l’aide d’un fichier de configuration

  1. Ajoutez le type d’importateur à l’élément <extensions> à l’intérieur de l’élément <policyImporters> dans le fichier de configuration du client.

    <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. Dans l'application cliente, utilisez System.ServiceModel.Description.MetadataResolver ou System.ServiceModel.Description.WsdlImporter pour résoudre les métadonnées, et l'importateur est appelé automatiquement.

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

Pour insérer l’importateur de stratégie personnalisé dans le système de métadonnées à l’aide de Svcutil.exe

  1. Ajoutez le type d’importateur à l’élément <extensions> à l’intérieur de l’élément <policyImporters> dans le fichier de configuration Svcutil.exe.config. Vous pouvez également indiquer à Svcutil.exe de charger les types d'importateurs de politiques inscrits dans un autre fichier de configuration en utilisant l’option /svcutilConfig.

  2. Utilisez l’outil Utilitaire de métadonnées ServiceModel (Svcutil.exe) pour importer les métadonnées et l’importateur est appelé automatiquement.

Pour insérer l’importateur de stratégie personnalisé dans le système de métadonnées par programmation

  1. Ajoutez l’importateur à la MetadataImporter.PolicyImportExtensions propriété (par exemple, si vous utilisez le System.ServiceModel.Description.WsdlImporter) avant d’importer les métadonnées.

Voir également