IPolicyImportExtension Schnittstelle
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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:
Sucht die benutzerdefinierte Richtlinien assertion, für die sie verantwortlich ist, indem sie abhängig vom Bereich entweder die GetBindingAssertionsMethoden oder GetMessageBindingAssertionsGetOperationBindingAssertions Methoden aufrufen.
Entfernt die Richtlinien assertion aus der Assertionsauflistung. Die PolicyAssertionCollection.Remove Methode sucht, gibt die Assertion in einem Schritt zurück und entfernt sie.
Ä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. |