Vorgehensweise: Importieren von benutzerdefinierten RichtlinienassertionenHow to: Import Custom Policy Assertions

Richtlinienassertionen beschreiben die Funktionen und Anforderungen eines Dienstendpunkts.Policy assertions describe the capabilities and requirements of a service endpoint. Clientanwendungen können Richtlinienassertionen in Dienstmetadaten nutzen, um die Clientbindung zu konfigurieren oder den Dienstvertrag für einen Dienstendpunkt anzupassen.Client applications can use policy assertions in service metadata to configure the client binding or to customize the service contract for a service endpoint.

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.Custom policy assertions are imported by implementing the System.ServiceModel.Description.IPolicyImportExtension interface and passing that object to the metadata system or by registering the implementation type in your application configuration file. Implementierungen der IPolicyImportExtension-Schnittstelle müssen den Standardkonstruktor bereitstellen.Implementations of the IPolicyImportExtension interface must provide a default constructor.

So importieren Sie benutzerdefinierte RichtlinienassertionenTo import custom policy assertions

  1. Implementieren Sie die System.ServiceModel.Description.IPolicyImportExtension-Schnittstelle auf einer Klasse.Implement the System.ServiceModel.Description.IPolicyImportExtension interface on a class. Anweisungen hierzu finden Sie in den folgenden Verfahren.See the following procedures.

  2. Fügen Sie das benutzerdefinierte Richtlinienimportprogramm durch eines der folgenden Verfahren ein:Insert the custom policy importer either by:

  3. Verwenden einer Konfigurationsdatei.Using a configuration file. Anweisungen hierzu finden Sie in den folgenden Verfahren.See the following procedures.

  4. Mithilfe einer Konfigurationsdatei mit ServiceModel Metadata Utility Tool (Svcutil.exe).Using a configuration file with ServiceModel Metadata Utility Tool (Svcutil.exe). Anweisungen hierzu finden Sie in den folgenden Verfahren.See the following procedures.

  5. Programmgesteuertes Einfügen des Richtlinienimportprogramms.Programmatically inserting the policy importer. Anweisungen hierzu finden Sie in den folgenden Verfahren.See the following procedures.

So implementieren Sie die System.ServiceModel.Description.IPolicyImportExtension-Schnittstelle auf einer beliebigen KlasseTo implement the System.ServiceModel.Description.IPolicyImportExtension interface on any class

  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).In the IPolicyImportExtension.ImportPolicy method, for each policy subject that you are interested in, find the policy assertions that you want to import by calling the appropriate method (depending upon the scope of the assertion that you want) on the System.ServiceModel.Description.PolicyConversionContext object passed to the method. 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.The following code example shows how to use the PolicyAssertionCollection.Remove method to locate the custom policy assertion and remove it from the collection in one step. Wenn Sie die Entfernen-Methode verwenden, um die Assertion ausfindig zu machen und zu entfernen, müssen Sie Schritt 4 nicht durchführen.If you use the remove method to locate and remove the assertion, you do not have to perform step 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. Verarbeiten Sie die Richtlinienassertionen.Process the policy assertions. Beachten Sie, dass das Richtliniensystem keine geschachtelten Richtlinien und wsp:optional normalisiert.Note that the policy system does not normalize nested policies and wsp:optional. Sie müssen diese Konstrukte in der Richtlinienimport-Erweiterungsimplementierung verarbeiten.You must process these constructs in your policy import extension implementation.

  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.Perform the customization to the binding or contract that supports the capability or requirement specified by the policy assertion. In der Regel geben Assertionen an, dass eine Bindung eine besondere Konfiguration oder ein bestimmtes Bindungselement erfordert.Typically assertions indicate that a binding requires a particular configuration or a specific binding element. Nehmen Sie diese Änderungen vor, indem Sie auf die PolicyConversionContext.BindingElements-Eigenschaft zugreifen.Make these modifications by accessing the PolicyConversionContext.BindingElements property. Andere Assertionen erfordern, dass Sie den Vertrag ändern.Other assertions require that you modify the contract. Sie können über die PolicyConversionContext.Contract-Eigenschaft auf den Vertrag zugreifen und diesen ändern.You can access and modify the contract using the PolicyConversionContext.Contract property. 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.Note that your policy importer may get called multiple times for the same binding and contract, but different policy alternatives if importing a policy alternative fails. Der Code sollte diesem Verhalten gegenüber flexibel sein.Your code should be resilient to this behavior.

  4. Entfernen Sie die die benutzerdefinierte Richtlinienassertion aus der Assertionsauflistung.Remove the custom policy assertion from the assertion collection. Wenn Sie die Assertion nicht entfernen, geht Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) davon aus, dass der Richtlinienimport nicht erfolgreich war und importiert die zugeordnete Bindung nicht.If you do not remove the assertion Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) assumes that the policy import was unsuccessful and does not import the associated binding. 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.If you used the PolicyAssertionCollection.Remove method to locate the custom policy assertion and remove it from the collection in one step you do not have to perform this step.

So fügen Sie das benutzerdefinierte Richtlinienimportprogramm mit einer Konfigurationsdatei ins Metadatensystem einTo insert the custom policy importer into the metadata System using a configuration file

  1. Fügen Sie den Importer-Tool, das <extensions> Element innerhalb der <PolicyImporters > Element in der Clientkonfigurationsdatei.Add the importer type to the <extensions> element inside the <policyImporters> element in the client configuration file.

    <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.In the client application, use the System.ServiceModel.Description.MetadataResolver or System.ServiceModel.Description.WsdlImporter to resolve the metadata and the importer is invoked automatically.

    // 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 einTo insert the custom policy importer into the metadata system using Svcutil.exe

  1. Fügen Sie den Importer-Tool, das <extensions> Element innerhalb der <PolicyImporters > Element in der Konfigurationsdatei "svcutil.exe.config".Add the importer type to the <extensions> element inside the <policyImporters> element in the Svcutil.exe.config configuration file. Ü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.You can also point Svcutil.exe to load policy importer types registered in a different configuration file by using the /svcutilConfig option.

  2. Verwendung ServiceModel Metadata Utility Tool (Svcutil.exe) zum Importieren von Metadaten und den Importer-Tool werden automatisch aufgerufen.Use ServiceModel Metadata Utility Tool (Svcutil.exe) to import the metadata and the importer is invoked automatically.

So fügen Sie das benutzerdefinierte Richtlinienimportprogramm programmgesteuert ins Metadatensystem einTo insert the custom policy importer into the metadata system programmatically

  1. Fügen Sie vor dem Import der Metadaten das Importprogramm zur MetadataImporter.PolicyImportExtensions-Eigenschaft hinzu (beispielsweise, wenn Sie System.ServiceModel.Description.WsdlImporter verwenden).Add the importer to the MetadataImporter.PolicyImportExtensions property (for example, if you are using the System.ServiceModel.Description.WsdlImporter) prior to importing the metadata.

Siehe auchSee Also

System.ServiceModel.Description.MetadataResolver
System.ServiceModel.Description.WsdlImporter
System.ServiceModel.Description.MetadataResolver
Erweitern des MetadatensystemsExtending the Metadata System