Partager via


IPolicyImportExtension Interface

Définition

Définit une méthode pour les objets qui importent des assertions de stratégie personnalisées relatives aux liaisons.

public interface class IPolicyImportExtension
public interface IPolicyImportExtension
type IPolicyImportExtension = interface
Public Interface IPolicyImportExtension
Dérivé

Exemples

L'exemple de code suivant montre l'utilisation de la méthode PolicyAssertionCollection.Remove pour rechercher, retourner et supprimer l'assertion en une seule étape.

  #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

L'exemple de code suivant montre le fichier de configuration de l'application cliente pour charger l'importateur de stratégie personnalisé lors de l'appel à 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>

L'exemple de code suivant montre l'utilisation du MetadataResolver pour télécharger et résoudre des métadonnées dans des objets de description.

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

Remarques

Implémentez l’interface IPolicyImportExtension pour rechercher des informations WSDL exposées par un point de terminaison particulier pour des assertions de stratégie personnalisées relatives aux possibilités ou aux exigences de point de terminaison. En général, un importateur de stratégie recherche une assertion spécifique et insère un élément de liaison, en configure un ou modifie le contrat pour prendre en charge les spécifications de l’assertion.

À la différence de son équivalent, IPolicyExportExtension, IPolicyImportExtension ne requiert pas d'implémentation par un objet BindingElement. Vous pouvez le charger à l'aide de la section de configuration du client, comme l'illustre la section Exemples ou par programme en l'ajoutant au constructeur System.ServiceModel.Description.WsdlImporter.

Windows Communication Foundation (WCF) transmet deux objets à la ImportPolicy méthode, a MetadataImporter et a PolicyConversionContext. En général, l’objet PolicyConversionContext contient déjà les assertions de stratégie pour chaque portée de liaison.

Une implémentation IPolicyImportExtension effectue les étapes suivantes :

  1. Recherche l'assertion de stratégie personnalisée de laquelle elle est chargée en appelant les méthodes GetBindingAssertions, GetMessageBindingAssertions ou GetOperationBindingAssertions, en fonction de la portée.

  2. Supprime l’assertion de stratégie de la collection d’assertions. La méthode PolicyAssertionCollection.Remove recherche, retourne et supprime l'assertion en une seule étape.

  3. Modifiez la pile de liaison ou le contrat en ajoutant un BindingElement personnalisé requis à la propriété BindingElements ou en modifiant la propriété PolicyConversionContext.Contract.

L'étape 2 est importante. Une fois que tous les importateurs de stratégie ont été appelés, WCF vérifie l’existence de toutes les assertions de stratégie qui restent. S’il en existe un, WCF part du principe que l’importation de stratégie a échoué et n’importe pas la liaison associée.

Important

Un fournisseur de métadonnées malveillant peut tenter d'envoyer du code XML incorrect dans le cadre des métadonnées, dans une tentative d'exploiter un importateur de stratégie. Il est fortement recommandé que les importateurs de stratégie personnalisés soit fiables quant à toutes les formes de code XML qui peuvent y être passées.

Les implémentations MetadataImporter personnalisées doivent implémenter leur propre objet PolicyConversionContext pour extraire les assertions de stratégie attachées au format de métadonnées personnalisé.

Si vous souhaitez exporter et importer des éléments WSDL personnalisés qui ne sont pas des assertions de stratégie, consultez System.ServiceModel.Description.IWsdlExportExtension et System.ServiceModel.Description.IWsdlImportExtension.

Notes

Vous pouvez utiliser des importateurs et des exportateurs de stratégie personnalisés avec l’outil Utilitaire de métadonnées ServiceModel (Svcutil.exe) en utilisant les mêmes éléments de configuration dans un fichier de configuration et l’option /svcutilConfig:<configFile> .

Méthodes

ImportPolicy(MetadataImporter, PolicyConversionContext)

Définit une méthode qui peut importer des assertions de stratégie personnalisées et ajouter des éléments de liaison d’implémentation.

S’applique à