Instrukcje: Importowanie niestandardowych asercji zasad
Asercji zasad opisują możliwości i wymagania punktu końcowego usługi. Aplikacje klienckie mogą używać asercji zasad w metadanych usługi, aby skonfigurować powiązanie klienta lub dostosować kontrakt usługi dla punktu końcowego usługi.
Niestandardowe asercji zasad są importowane przez zaimplementowanie interfejsu System.ServiceModel.Description.IPolicyImportExtension i przekazanie tego obiektu do systemu metadanych lub zarejestrowanie typu implementacji w pliku konfiguracji aplikacji. Implementacje interfejsu IPolicyImportExtension muszą zapewniać konstruktor bez parametrów.
Aby zaimportować niestandardowe asercji zasad
Zaimplementuj System.ServiceModel.Description.IPolicyImportExtension interfejs w klasie. Zapoznaj się z poniższymi procedurami.
Wstaw niestandardowy importer zasad za pomocą:
Przy użyciu pliku konfiguracji. Zapoznaj się z poniższymi procedurami.
Za pomocą pliku konfiguracji z narzędziem ServiceModel Metadata Tool (Svcutil.exe). Zapoznaj się z poniższymi procedurami.
Programowe wstawianie importera zasad. Zapoznaj się z poniższymi procedurami.
Aby zaimplementować interfejs System.ServiceModel.Description.IPolicyImportExtension w dowolnej klasie
W metodzie IPolicyImportExtension.ImportPolicy dla każdego zainteresowanego podmiotu zasad znajdź asercji zasad, które chcesz zaimportować, wywołując odpowiednią metodę (w zależności od zakresu żądanego potwierdzenia) na System.ServiceModel.Description.PolicyConversionContext obiekcie przekazanym do metody. Poniższy przykład kodu przedstawia sposób użycia metody w PolicyAssertionCollection.Remove celu zlokalizowania niestandardowej asercji zasad i usunięcia jej z kolekcji w jednym kroku. Jeśli używasz metody remove do lokalizowania i usuwania asercji, nie musisz wykonywać kroku 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
Przetwarzanie asercji zasad. Należy pamiętać, że system zasad nie normalizuje zagnieżdżonych zasad ani
wsp:optional
. Te konstrukcje należy przetworzyć w implementacji rozszerzenia importu zasad.Wykonaj dostosowanie do powiązania lub kontraktu obsługującego możliwość lub wymaganie określone przez asercję zasad. Zazwyczaj asercji wskazują, że powiązanie wymaga określonej konfiguracji lub określonego elementu powiązania. Wprowadź te modyfikacje, korzystając PolicyConversionContext.BindingElements z właściwości . Inne asercji wymagają zmodyfikowania kontraktu. Możesz uzyskać dostęp do kontraktu i zmodyfikować go PolicyConversionContext.Contract przy użyciu właściwości . Należy pamiętać, że importer zasad może być wywoływany wiele razy dla tego samego powiązania i kontraktu, ale różne alternatywy zasad w przypadku importowania alternatywy zasad nie powiedzie się. Kod powinien być odporny na to zachowanie.
Usuń asercji zasad niestandardowych z kolekcji asercji. Jeśli nie usuniesz asercji Windows Communication Foundation (WCF) zakłada, że importowanie zasad nie powiodło się i nie importuje skojarzonego powiązania. Jeśli użyto PolicyAssertionCollection.Remove metody w celu zlokalizowania asercji zasad niestandardowych i usunięcia jej z kolekcji w jednym kroku, nie trzeba wykonywać tego kroku.
Aby wstawić niestandardowy importer zasad do systemu metadanych przy użyciu pliku konfiguracji
Dodaj typ importera do
<extensions>
elementu wewnątrz <elementu policyImporters> w pliku konfiguracji klienta.<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>
W aplikacji klienckiej użyj elementu System.ServiceModel.Description.MetadataResolver lub System.ServiceModel.Description.WsdlImporter , aby rozpoznać metadane, a importer jest wywoływany automatycznie.
// 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"))
Aby wstawić niestandardowy importer zasad do systemu metadanych przy użyciu Svcutil.exe
Dodaj typ importera do
<extensions>
elementu wewnątrz <elementu policyImporters> w pliku konfiguracji Svcutil.exe.config. Można również wskazać Svcutil.exe, aby załadować typy importerów zasad zarejestrowanych w innym pliku konfiguracji przy użyciu/svcutilConfig
opcji .Użyj narzędzia ServiceModel Metadata Tool (Svcutil.exe), aby zaimportować metadane, a importer jest wywoływany automatycznie.
Aby programowo wstawić importera zasad niestandardowych do systemu metadanych
- Dodaj importera do MetadataImporter.PolicyImportExtensions właściwości (na przykład jeśli używasz System.ServiceModel.Description.WsdlImporterklasy ) przed zaimportowaniem metadanych.