Procedure: Aangepaste beleidsverklaringen importeren
Beleidsverklaringen beschrijven de mogelijkheden en vereisten van een service-eindpunt. Clienttoepassingen kunnen beleidsverklaringen gebruiken in servicemetagegevens om de clientbinding te configureren of om het servicecontract voor een service-eindpunt aan te passen.
Aangepaste beleidsverklaringen worden geïmporteerd door de System.ServiceModel.Description.IPolicyImportExtension interface te implementeren en dat object door te geven aan het metagegevenssysteem of door het implementatietype in uw toepassingsconfiguratiebestand te registreren. Implementaties van de IPolicyImportExtension interface moeten een parameterloze constructor bieden.
Aangepaste beleidsverklaringen importeren
Implementeer de System.ServiceModel.Description.IPolicyImportExtension interface op een klasse. Zie de volgende procedures.
Voeg de aangepaste beleidsimporteur in door:
Een configuratiebestand gebruiken. Zie de volgende procedures.
Een configuratiebestand gebruiken met het hulpprogramma Voor metagegevens van ServiceModel (Svcutil.exe). Zie de volgende procedures.
Programmatisch de beleidsimporteur invoegen. Zie de volgende procedures.
De interface System.ServiceModel.Description.IPolicyImportExtension implementeren op elke klasse
Zoek in de IPolicyImportExtension.ImportPolicy methode voor elk beleidsonderwerp waarin u geïnteresseerd bent de beleidsverklaringen die u wilt importeren door de juiste methode aan te roepen (afhankelijk van het bereik van de gewenste assertie) voor het System.ServiceModel.Description.PolicyConversionContext object dat aan de methode is doorgegeven. In het volgende codevoorbeeld ziet u hoe u de methode gebruikt om de PolicyAssertionCollection.Remove aangepaste beleidsverklaring te vinden en deze in één stap uit de verzameling te verwijderen. Als u de verwijdermethode gebruikt om de assertie te zoeken en te verwijderen, hoeft u stap 4 niet uit te voeren.
// 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
De beleidsverklaringen verwerken. Houd er rekening mee dat het beleidssysteem geneste beleidsregels niet normaliseert en
wsp:optional
. U moet deze constructies verwerken in de implementatie van de importuitbreiding voor beleid.Voer de aanpassing uit aan de binding of het contract die ondersteuning biedt voor de mogelijkheid of vereiste die is opgegeven door de beleidsverklaring. Meestal geven asserties aan dat een binding een bepaalde configuratie of een specifiek bindingselement vereist. Breng deze wijzigingen aan door toegang te krijgen tot de PolicyConversionContext.BindingElements eigenschap. Voor andere beweringen moet u het contract wijzigen. U kunt het contract openen en wijzigen met behulp van de PolicyConversionContext.Contract eigenschap. Houd er rekening mee dat uw beleidsimporteur meerdere keren wordt aangeroepen voor dezelfde binding en hetzelfde contract, maar verschillende beleidsalternatieven als het importeren van een beleidsalternatief mislukt. Uw code moet tolerant zijn voor dit gedrag.
Verwijder de aangepaste beleidsverklaring uit de assertieverzameling. Als u de assertie Windows Communication Foundation (WCF) niet verwijdert, wordt ervan uitgegaan dat het importeren van het beleid mislukt en de bijbehorende binding niet importeert. Als u de PolicyAssertionCollection.Remove methode hebt gebruikt om de aangepaste beleidsverklaring te vinden en deze in één stap uit de verzameling te verwijderen, hoeft u deze stap niet uit te voeren.
De importfunctie voor aangepast beleid invoegen in het metagegevenssysteem met behulp van een configuratiebestand
Voeg het importtype toe aan het
<extensions>
element in het <element policyImporters> in het clientconfiguratiebestand.<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>
Gebruik in de clienttoepassing de System.ServiceModel.Description.MetadataResolver metagegevens of System.ServiceModel.Description.WsdlImporter om de metagegevens op te lossen en de importeur wordt automatisch aangeroepen.
// 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"))
De importfunctie voor aangepast beleid invoegen in het metagegevenssysteem met behulp van Svcutil.exe
Voeg het importtype toe aan het
<extensions>
element in het <element policyImporters> in het configuratiebestand Svcutil.exe.config. U kunt ook Svcutil.exe wijzen om importtypen te laden die zijn geregistreerd in een ander configuratiebestand met behulp van de/svcutilConfig
optie.Gebruik het hulpprogramma hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) om de metagegevens te importeren en de importeur wordt automatisch aangeroepen.
De importfunctie voor aangepast beleid via programmacode invoegen in het metagegevenssysteem
- Voeg de importeur toe aan de MetadataImporter.PolicyImportExtensions eigenschap (bijvoorbeeld als u de System.ServiceModel.Description.WsdlImporter) gebruikt voordat u de metagegevens importeert.