Freigeben über


Vorgehensweise: Importieren von benutzerdefinierten Richtlinienassertionen

Richtlinienassertionen beschreiben die Funktionen und Anforderungen eines Dienstendpunkts. Clientanwendungen können Richtlinienassertionen in Dienstmetadaten nutzen, um die Clientbindung zu konfigurieren oder den Dienstvertrag für einen Dienstendpunkt anzupassen.

Benutzerdefinierte Richtlinienassertionen werden importiert, indem die System.ServiceModel.Description.IPolicyImportExtension-Schnittstelle implementiert und das Objekt in das Metadatensystem übergeben wird oder durch die Registrierung des Implementierungstyps in Ihrer Anwendungskonfigurationsdatei. Implementierungen der Schnittstelle IPolicyImportExtension müssen einen parameterlosen Konstruktor bereitstellen.

So importieren Sie benutzerdefinierte Richtlinienassertionen

  1. Implementieren Sie die System.ServiceModel.Description.IPolicyImportExtension-Schnittstelle auf einer Klasse. Anweisungen hierzu finden Sie in den folgenden Verfahren.

  2. Fügen Sie das benutzerdefinierte Richtlinienimportprogramm durch eines der folgenden Verfahren ein:

  3. Verwenden einer Konfigurationsdatei. Anweisungen hierzu finden Sie in den folgenden Verfahren.

  4. Verwenden einer Konfigurationsdatei mit serviceModel Metadata Utility Tool (Svcutil.exe). Anweisungen hierzu finden Sie in den folgenden Verfahren.

  5. Programmgesteuertes Einfügen des Richtlinienimportprogramms. Anweisungen hierzu finden Sie in den folgenden Verfahren.

So implementieren Sie die System.ServiceModel.Description.IPolicyImportExtension-Schnittstelle auf einer beliebigen Klasse

  1. Suchen Sie für jedes Richtliniensubjekt, an dem Sie interessiert sind, in der IPolicyImportExtension.ImportPolicy-Methode die Richtlinienassertionen, die Sie importieren möchten, indem Sie die entsprechende Methode auf dem zur Methode übergebenen System.ServiceModel.Description.PolicyConversionContext-Objekt aufrufen (abhängig vom Umfang der gewünschten Assertion). Im folgenden Codebeispiel wird veranschaulicht, wie die PolicyAssertionCollection.Remove-Methode verwendet wird, um die benutzerdefinierte Richtlinienassertion ausfindig zu machen und diese in einem Schritt aus der Sammlung zu entfernen. Wenn Sie die Entfernen-Methode verwenden, um die Assertion ausfindig zu machen und zu entfernen, müssen Sie Schritt 4 nicht durchführen.

    // 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. Verarbeiten Sie die Richtlinienassertionen. Beachten Sie, dass das Richtliniensystem keine geschachtelten Richtlinien und wsp:optional normalisiert. Sie müssen diese Konstrukte in der Richtlinienimport-Erweiterungsimplementierung verarbeiten.

  3. Nehmen Sie die Anpassung an der Bindung oder am Vertrag vor, die bzw. der die von der Richtlinienassertion festgelegte Funktion oder Anforderung erfüllt. In der Regel geben Assertionen an, dass eine Bindung eine besondere Konfiguration oder ein bestimmtes Bindungselement erfordert. Nehmen Sie diese Änderungen vor, indem Sie auf die PolicyConversionContext.BindingElements-Eigenschaft zugreifen. Andere Assertionen erfordern, dass Sie den Vertrag ändern. Sie können über die PolicyConversionContext.Contract-Eigenschaft auf den Vertrag zugreifen und diesen ändern. Beachten Sie, dass Ihr Richtlinienimportprogramm möglicherweise mehrere Male für dieselbe Bindung und für denselben Vertrag, aber für unterschiedliche Richtlinienalternativen aufgerufen wird, wenn der Import einer Richtlinienalternative fehlschlägt. Der Code sollte diesem Verhalten gegenüber flexibel sein.

  4. Entfernen Sie die die benutzerdefinierte Richtlinienassertion aus der Assertionsauflistung. Wenn Sie die Assertion nicht entfernen, geht Windows Communication Foundation (WCF) davon aus, dass der Richtlinienimport nicht erfolgreich war und importiert die zugeordnete Bindung nicht. Wenn Sie die PolicyAssertionCollection.Remove-Methode verwendet haben, um die benutzerdefinierte Assertion ausfindig zu machen und diese in einem Schritt aus der Auflistung zu entfernen, müssen Sie diesen Schritt nicht durchführen.

So fügen Sie das benutzerdefinierte Richtlinienimportprogramm mit einer Konfigurationsdatei ins Metadatensystem ein

  1. Fügen Sie den Typ des Importprogramms zum <policyImporters><extensions>-Element innerhalb des Elements in der Clientkonfigurationsdatei hinzu.

    <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. Verwenden Sie in der Clientanwendung System.ServiceModel.Description.MetadataResolver oder System.ServiceModel.Description.WsdlImporter zur Auflösung der Metadaten. Das Importprogramm wird daraufhin automatisch ausgelöst.

    // 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"))
    

So fügen Sie das benutzerdefinierte Richtlinienimportprogramm mithilfe der Datei Svcutil.exe ins Metadatensystem ein

  1. Fügen Sie den Typ des Importprogramms zum <policyImporters><extensions>-Element innerhalb des Elements in der Datei Svcutil.exe hinzu. Über die Option /svcutilConfig können Sie Svcutil.exe darüber hinaus dazu bringen, Typen von Richtlinienprogrammen zu laden, die in einer anderen Konfigurationsdatei gespeichert sind.

  2. Verwenden Sie das ServiceModel-Metadaten-Hilfstool (Svcutil.exe), um die Metadaten zu importieren, und der Importeur wird automatisch aufgerufen.

So fügen Sie das benutzerdefinierte Richtlinienimportprogramm programmgesteuert ins Metadatensystem ein

  1. Fügen Sie vor dem Import der Metadaten das Importprogramm zur MetadataImporter.PolicyImportExtensions-Eigenschaft hinzu (beispielsweise, wenn Sie System.ServiceModel.Description.WsdlImporter verwenden).

Siehe auch