Procédure : importer des assertions de stratégie personnalisées
Les assertions de stratégie décrivent les fonctions 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 cliente ou personnaliser le contrat de service d’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 passant cet objet au système de métadonnées ou en enregistrant le type d'implémentation dans le fichier de configuration de votre application. Les implémentations de l’interface IPolicyImportExtension doivent fournir un constructeur sans paramètres.
Pour importer des assertions de stratégie personnalisées
Implémentez l'interface System.ServiceModel.Description.IPolicyImportExtension sur une classe. Reportez-vous aux procédures ci-dessous.
Insérez l'importateur de stratégie personnalisé selon l'une des méthodes suivantes :
Utilisation d'un fichier de configuration. Reportez-vous aux procédures ci-dessous.
Utilisation d’un fichier de configuration avec ServiceModel Metadata Utility Tool (Svcutil.exe). Reportez-vous aux procédures ci-dessous.
Insertion par programme de l'importateur de stratégie. Reportez-vous aux procédures ci-dessous.
Pour implémenter l'interface System.ServiceModel.Description.IPolicyImportExtension sur une classe
Dans la méthode IPolicyImportExtension.ImportPolicy, recherchez, pour chaque sujet de stratégie qui vous intéresse, les assertions de stratégie que vous souhaitez importer en appelant la méthode appropriée (selon sur la portée de l'assertion de votre choix) sur l'objet System.ServiceModel.Description.PolicyConversionContext passé à la méthode. L’exemple de code suivant indique comment utiliser la méthode PolicyAssertionCollection.Remove pour localiser l’assertion de stratégie personnalisée et la supprimer de la collection en une étape. Si vous utilisez la méthode de suppression pour localiser et supprimer l'assertion, l'étape 4 n'est pas nécessaire.
// 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
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 constructions dans votre implémentation d'extension d'importation de stratégie.Exécutez la personnalisation sur la liaison ou le contrat qui prend en charge la fonction ou la spécification spécifiée par l’assertion de stratégie. En général, les assertions indiquent qu’une liaison requiert une configuration particulière ou un élément de liaison spécifique. Apportez ces modifications en accédant à la propriété PolicyConversionContext.BindingElements. D'autres assertions requièrent la modification du contrat. Vous pouvez accéder et modifier le contrat à l'aide de la propriété PolicyConversionContext.Contract. Notez que votre importateur de stratégie peut être appelé plusieurs fois pour la même liaison et le même contrat, mais pour des alternatives de stratégie différentes en cas d’échec de l’importation d’une alternative de stratégie. Votre code doit être résilient à ce comportement.
Supprimez l'assertion de stratégie personnalisée de la collection d'assertions. Si vous ne supprimez pas l’assertion, Windows Communication Foundation (WCF) suppose que l’importation de stratégie a échoué et n’importe pas la liaison associée. Si vous avez utilisé la méthode PolicyAssertionCollection.Remove pour localiser l’assertion de stratégie personnalisée et la supprimer de la collection en une étape, cette étape n’est pas nécessaire.
Pour insérer l'importateur de stratégie personnalisé dans le système de métadonnées à l'aide d'un fichier de configuration
Ajoutez le type d'importateur à l’élément
<extensions>
dans l’élément <policyImporters> dans le fichier de configuration 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>
Dans l'application cliente, utilisez System.ServiceModel.Description.MetadataResolver ou System.ServiceModel.Description.WsdlImporter pour résoudre les métadonnées, l'importateur étant 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
Ajoutez le type d’importateur à l’élément
<extensions>
dans l’élément <policyImporters> dans le fichier de configuration de Svcutil.exe. Vous pouvez également pointer Svcutil.exe pour charger les types d'importateur de stratégie enregistrés dans un autre fichier de configuration à l'aide de l'option/svcutilConfig
.Utilisez ServiceModel Metadata Utility Tool (Svcutil.exe) pour importer les métadonnées et l’importateur est appelé automatiquement.
Pour insérer par programme l'importateur de stratégie personnalisé dans le système de métadonnées
- Ajoutez l'importateur à la propriété MetadataImporter.PolicyImportExtensions (par exemple, si vous utilisez System.ServiceModel.Description.WsdlImporter) avant d'importer les métadonnées.