Udostępnij za pośrednictwem


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

  1. Zaimplementuj System.ServiceModel.Description.IPolicyImportExtension interfejs w klasie. Zapoznaj się z poniższymi procedurami.

  2. Wstaw niestandardowy importer zasad za pomocą:

  3. Przy użyciu pliku konfiguracji. Zapoznaj się z poniższymi procedurami.

  4. Za pomocą pliku konfiguracji z narzędziem ServiceModel Metadata Tool (Svcutil.exe). Zapoznaj się z poniższymi procedurami.

  5. Programowe wstawianie importera zasad. Zapoznaj się z poniższymi procedurami.

Aby zaimplementować interfejs System.ServiceModel.Description.IPolicyImportExtension w dowolnej klasie

  1. 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
    
  2. 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.

  3. 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.

  4. 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

  1. 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>
    
  2. 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

  1. 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 .

  2. 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

  1. Dodaj importera do MetadataImporter.PolicyImportExtensions właściwości (na przykład jeśli używasz System.ServiceModel.Description.WsdlImporterklasy ) przed zaimportowaniem metadanych.

Zobacz też