Freigeben über


IPolicyImportExtension Schnittstelle

Definition

Definiert eine Methode für Objekte, die benutzerdefinierte Richtlinien assertionen zu Bindungen importieren.

public interface class IPolicyImportExtension
public interface IPolicyImportExtension
type IPolicyImportExtension = interface
Public Interface IPolicyImportExtension
Abgeleitet

Beispiele

Das folgende Codebeispiel zeigt die Verwendung der PolicyAssertionCollection.Remove Methode zum Suchen, Zurückgeben und Entfernen der Assertion in einem Schritt.

  #region IPolicyImporter Members
  public const string name1 = "acme";
  public const string ns1 = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions";

  /*
   * Importing policy assertions usually means modifying the bindingelement stack in some way
   * to support the policy assertion. The procedure is:
   * 1. Find the custom assertion to import.
   * 2. Insert a supporting custom bindingelement or modify the current binding element collection
   *     to support the assertion.
   * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned,
   *     any remaining assertions for the binding cause the binding to fail import and not be
   *     constructed.
   */
  public void ImportPolicy(MetadataImporter importer, PolicyConversionContext context)
  {
    Console.WriteLine("The custom policy importer has been called.");
    // 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;
    }
 }
#endregion
    #Region "IPolicyImporter Members"
    Public Const name1 As String = "acme"
    Public Const ns1 As String = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions"

'    
'     * Importing policy assertions usually means modifying the bindingelement stack in some way
'     * to support the policy assertion. The procedure is:
'     * 1. Find the custom assertion to import.
'     * 2. Insert a supporting custom bindingelement or modify the current binding element collection
'     *     to support the assertion.
'     * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned, 
'     *     any remaining assertions for the binding cause the binding to fail import and not be 
'     *     constructed.
'     
    Public Sub ImportPolicy(ByVal importer As MetadataImporter, ByVal context As PolicyConversionContext) Implements IPolicyImportExtension.ImportPolicy
      Console.WriteLine("The custom policy importer has been called.")
      ' 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
    End Sub
  #End Region

Das folgende Codebeispiel zeigt die Clientanwendungskonfigurationsdatei zum Laden des benutzerdefinierten Richtlinienimporteurs, wenn der System.ServiceModel.Description.MetadataResolver Aufruf erfolgt.

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

Das folgende Codebeispiel zeigt die Verwendung der Metadaten zum Herunterladen und Auflösen von MetadataResolver Metadaten in Beschreibungsobjekte.

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

Hinweise

Implementieren Sie die IPolicyImportExtension Schnittstelle zum Durchsuchen von WSDL-Informationen, die von einem bestimmten Endpunkt für benutzerdefinierte Richtlinien assertionen zu Endpunktfunktionen oder -anforderungen verfügbar gemacht werden. In der Regel sucht ein Richtlinienimporteur nach einer bestimmten Assertion und fügt entweder ein Bindungselement ein, konfiguriert ein Bindungselement oder ändert den Vertrag, um die Anforderungen der Assertion zu unterstützen.

Im Gegensatz zum Gegenstück IPolicyImportExtensionIPolicyExportExtensionist keine Implementierung durch ein BindingElement Objekt erforderlich. Sie können sie mithilfe des im Abschnitt "Beispiele" gezeigten Clientkonfigurationsabschnitts laden oder programmgesteuert dem System.ServiceModel.Description.WsdlImporter Konstruktor hinzufügen.

Windows Communication Foundation (WCF) übergibt zwei Objekte an die ImportPolicy Methode, a MetadataImporter und a PolicyConversionContext. In der Regel enthält das PolicyConversionContext Objekt bereits die Richtlinien assertionen für jeden Bindungsbereich.

Eine IPolicyImportExtension Implementierung führt die folgenden Schritte aus:

  1. Sucht die benutzerdefinierte Richtlinien assertion, für die sie verantwortlich ist, indem sie abhängig vom Bereich entweder die GetBindingAssertionsMethoden oder GetMessageBindingAssertionsGetOperationBindingAssertions Methoden aufrufen.

  2. Entfernt die Richtlinien assertion aus der Assertionsauflistung. Die PolicyAssertionCollection.Remove Methode sucht, gibt die Assertion in einem Schritt zurück und entfernt sie.

  3. Ändern Sie den Bindungsstapel oder den Vertrag, indem Sie entweder eine BindingElements erforderliche benutzerdefinierte BindingElement Eigenschaft hinzufügen oder die PolicyConversionContext.Contract Eigenschaft ändern.

Schritt 2 ist wichtig. Nachdem alle Richtlinienimporteure aufgerufen wurden, prüft WCF nach dem Vorhandensein von Richtlinienbehauptungen, die verbleiben. Wenn eine vorhanden ist, geht WCF davon aus, dass der Richtlinienimport nicht erfolgreich war und die zugeordnete Bindung nicht importiert.

Von Bedeutung

Ein Lieferant bösartiger Metadaten kann versuchen, falsch formatierten XML-Code als Teil von Metadaten zu senden, um einen Richtlinienimporteur auszunutzen. Es wird dringend empfohlen, dass benutzerdefinierte Richtlinienimporteure robust für alle Xml-Formen sind, die an sie übergeben werden können.

Benutzerdefinierte Implementierungen müssen ihr eigenes PolicyConversionContext Objekt implementieren, um die Richtlinien assertionen zu extrahieren, die dem benutzerdefinierten MetadataImporter Metadatenformat zugeordnet sind.

Wenn Sie benutzerdefinierte WSDL-Elemente exportieren und importieren möchten, die keine Richtlinien assertionen sind, siehe System.ServiceModel.Description.IWsdlExportExtension und System.ServiceModel.Description.IWsdlImportExtension.

Hinweis

Sie können benutzerdefinierte Richtlinienimporteure und Exporter mit dem ServiceModel Metadata Utility Tool (Svcutil.exe) verwenden, indem Sie dieselben Konfigurationselemente in einer Konfigurationsdatei und die /svcutilConfig:<configFile> Option verwenden.

Methoden

Name Beschreibung
ImportPolicy(MetadataImporter, PolicyConversionContext)

Definiert eine Methode, die benutzerdefinierte Richtlinien assertionen importieren und implementierende Bindungselemente hinzufügen kann.

Gilt für: