Gör så här: Importera anpassade principkontroller
Principkontroller beskriver funktionerna och kraven för en tjänstslutpunkt. Klientprogram kan använda principkontroller i tjänstmetadata för att konfigurera klientbindningen eller för att anpassa tjänstkontraktet för en tjänstslutpunkt.
Anpassade principkontroller importeras genom att gränssnittet implementeras System.ServiceModel.Description.IPolicyImportExtension och objektet skickas till metadatasystemet eller genom att implementeringstypen registreras i programkonfigurationsfilen. Implementeringar av IPolicyImportExtension gränssnittet måste tillhandahålla en parameterlös konstruktor.
Importera anpassade principkontroller
Implementera gränssnittet i System.ServiceModel.Description.IPolicyImportExtension en klass. Se följande procedurer.
Infoga den anpassade principimportören genom att:
Använda en konfigurationsfil. Se följande procedurer.
Använda en konfigurationsfil med ServiceModel Metadata Utility Tool (Svcutil.exe). Se följande procedurer.
Programmatiskt infogar principimportören. Se följande procedurer.
Implementera gränssnittet System.ServiceModel.Description.IPolicyImportExtension på valfri klass
IPolicyImportExtension.ImportPolicy I metoden hittar du de principkontroller som du vill importera för varje principämne som du är intresserad av genom att anropa lämplig metod (beroende på omfånget för det försäkran du vill ha) för System.ServiceModel.Description.PolicyConversionContext objektet som skickas till metoden. Följande kodexempel visar hur du använder PolicyAssertionCollection.Remove metoden för att hitta den anpassade principkontroll och ta bort den från samlingen i ett steg. Om du använder metoden ta bort för att hitta och ta bort försäkran behöver du inte utföra steg 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
Bearbeta principkontrollerna. Observera att principsystemet inte normaliserar kapslade principer och
wsp:optional
. Du måste bearbeta dessa konstruktioner i implementeringen av principimporttillägget.Utför anpassningen till bindningen eller kontraktet som stöder den funktion eller det krav som anges i principkontroll. Vanligtvis indikerar försäkran att en bindning kräver en viss konfiguration eller ett specifikt bindningselement. Gör dessa ändringar genom att komma åt egenskapen PolicyConversionContext.BindingElements . Andra intyg kräver att du ändrar kontraktet. Du kan komma åt och ändra kontraktet med hjälp av PolicyConversionContext.Contract egenskapen . Observera att din principimportör kan anropas flera gånger för samma bindning och kontrakt, men olika principalternativ om importen av ett principalternativ misslyckas. Koden bör vara motståndskraftig mot det här beteendet.
Ta bort den anpassade principkontroll från kontrollsamlingen. Om du inte tar bort försäkran förutsätter WCF (Windows Communication Foundation) att principimporten misslyckades och inte importerar den associerade bindningen. Om du använde PolicyAssertionCollection.Remove metoden för att hitta den anpassade principkontroll och ta bort den från samlingen i ett steg behöver du inte utföra det här steget.
Infoga den anpassade principimportören i metadatasystemet med hjälp av en konfigurationsfil
Lägg till importertypen i elementet
<extensions>
i elementet <policyImporters> i klientkonfigurationsfilen.<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>
I klientprogrammet använder System.ServiceModel.Description.MetadataResolver du eller System.ServiceModel.Description.WsdlImporter för att lösa metadata och importören anropas automatiskt.
// 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"))
Infoga den anpassade principimportören i metadatasystemet med hjälp av Svcutil.exe
Lägg till importertypen i elementet
<extensions>
i elementet <policyImporters> i konfigurationsfilen Svcutil.exe.config. Du kan också peka Svcutil.exe för att läsa in principimportörstyper som registrerats i en annan konfigurationsfil med hjälp/svcutilConfig
av alternativet .Använd ServiceModel Metadata Utility Tool (Svcutil.exe) för att importera metadata och importören anropas automatiskt.
Infoga den anpassade principimportören i metadatasystemet programmatiskt
- Lägg till importören i MetadataImporter.PolicyImportExtensions egenskapen (till exempel om du använder System.ServiceModel.Description.WsdlImporter) innan du importerar metadata.