Freigeben über


Importieren von benutzerdefinierten Metadaten für eine WCF-Erweiterung

In Windows Communication Foundation (WCF) ist der Metadatenimport der Prozess des Generierens einer abstrakten Darstellung eines Diensts oder seiner Komponententeile aus seinen Metadaten. WCF kann beispielsweise Instanzen von ServiceEndpoint, Binding oder ContractDescription aus einem WSDL-Dokument für einen Dienst importieren. Mit einer Implementierung der abstrakten System.ServiceModel.Description.MetadataImporter-Klasse können Sie Metadaten von Diensten in WCF importieren. Die Unterstützung für das Importieren von Metadatenformaten, die die Importlogik der WS-Richtlinie in WCF unterstützen, wird durch Typen implementiert, die von der MetadataImporter-Klasse abgeleitet sind.

Benutzerdefinierte Metadaten bestehen aus XML-Elementen, die die Metadatenimportmechanismen des Systems nicht verarbeiten können. Dazu gehören i. d. R. auch benutzerdefinierte WSDL-Erweiterungen sowie benutzerdefinierte Richtlinienassertionen.

In diesem Abschnitt wird beschrieben, wie benutzerdefinierte WSDL-Erweiterungen und benutzerdefinierte Richtlinienassertionen importiert werden. Dabei wird der eigentliche Importvorgang nur am Rande erläutert. Weitere Informationen über die Nutzung der Typen, die Metadaten unabhängig davon, ob sie benutzerdefiniert oder systemgestützt sind, exportieren und importieren, finden Sie unter Exportieren und Importieren von Metadaten.

Übersicht

Der System.ServiceModel.Description.WsdlImporter-Typ stellt die Implementierung der abstrakten MetadataImporter-Klasse in WCF dar. Der WsdlImporter-Typ importiert WSDL-Metadaten mit angefügten Richtlinien, die in einem System.ServiceModel.Description.MetadataSet-Objekt zusammengefasst sind. Richtlinienassertionen und WSDL-Erweiterungen, die von den Standardimportern nicht erkannt werden, werden an eine registrierte benutzerdefinierte Richtlinie oder an einen registrierten WSDL-Importer übergeben, um sie zu importieren. Normalerweise werden Importprogramme zur Unterstützung von benutzerdefinierten Bindungselementen oder zur Änderung des importierten Vertrags implementiert.

Dieser Abschnitt beschreibt:

  1. Implementierung und Verwendung der System.ServiceModel.Description.IWsdlImportExtension-Schnittstelle, die die WSDL-Daten für benutzerdefinierte Importer verfügbar macht, bevor Beschreibungen und Code generiert werden. Mit dieser Schnittstelle können Sie die Beschreibungen und die Codekompilierungen mit einem vorhandenen Satz von Metadaten untersuchen oder ändern.

  2. Implementierung und Verwendung der System.ServiceModel.Description.IPolicyImportExtension-Schnittstelle, die die Richtlinienassertionen für Importer verfügbar macht, bevor Beschreibungsobjekte generiert werden. Mit dieser Schnittstelle können Sie die Bindung oder den Vertrag anhand der heruntergeladenen Richtlinien untersuchen oder ändern.

Weitere Informationen zum Exportieren von benutzerdefinierten WSDL- und Richtlinien assertionen finden Sie unter Exportieren von benutzerdefinierten Metadaten für eine WCF-Erweiterung.

Importieren von benutzerdefinierten WSDL-Erweiterungen

Implementieren Sie die IWsdlImportExtension-Schnittstelle, und fügen Sie diese Implementierung der WsdlImportExtensions-Eigenschaft hinzu, um eine Unterstützung für das Importieren von WSDL-Erweiterungen hinzuzufügen. Der WsdlImporter kann auch Implementierungen der IWsdlImportExtension-Schnittstelle laden, die in der Konfigurationsdatei der Anwendung registriert sind. Einige WSDL-Importer sind standardmäßig registriert, und die Reihenfolge der registrierten WSDL-Importer ist von Bedeutung.

Wenn ein benutzerdefinierter WSDL-Importer geladen und vom WsdlImporter verwendet wird, wird zunächst die BeforeImport-Methode aufgerufen, um eine Änderung der Metadaten vor dem Import zu ermöglichen. Anschließend werden die Verträge importiert, und die ImportContract-Methode wird aufgerufen, um eine Änderung der aus den Metadaten importierten Verträge zu ermöglichen. Abschließend wird die ImportEndpoint-Methode aufgerufen, um die Änderung der importierten Endpunkte zu ermöglichen.

Weitere Informationen finden Sie unter Vorgehensweise: Importieren von benutzerdefinierter WSDL.

Importieren von benutzerdefinierten Richtlinienassertionen

Die Verarbeitung verschiedener Richtlinienassertionen, die an WSDL-Dokumente angefügt sind, wird automatisch vom WsdlImporter-Typ und dem ServiceModel Metadata Utility Tool (Svcutil.exe) behandelt. Diese Tools erfassen, normalisieren, und führen Richtlinienausdrücke zusammen, die an WSDL-Bindungen und WSDL-Anschlüsse angefügt sind.

Implementieren Sie die IPolicyImportExtension-Schnittstelle, und fügen Sie diese Implementierung der PolicyImportExtensions-Eigenschaft hinzu, um eine Unterstützung für das Importieren von benutzerdefinierten Richtlinienassertionen hinzuzufügen. Der MetadataImporter kann auch Implementierungen der IPolicyImportExtension-Schnittstelle laden, die in der Konfigurationsdatei der Anwendung registriert sind. Einige Richtlinienimporter sind standardmäßig registriert, und die Reihenfolge der registrierten Richtlinienimporter ist von Bedeutung.

Die IPolicyImportExtension.ImportPolicy-Methode wird vom Metadatensystem wiederholt für alle registrierten Richtlinienimporterweiterungen aufgerufen. Dies geschieht für alle Kombinationen von Richtlinienalternativen, die an eine Nachricht, einen Vorgang oder an das Richtliniensubjekt eines Endpunkts angefügt sind. Beim Importieren eines WSDL-Anschlusses werden die an den Anschluss angefügten Richtlinien sowie die entsprechenden WSDL-Bindungen vor einem Aufruf in die Richtlinienimporterweiterungen zusammengeführt. Die Richtlinienalternativen werden durch einen PolicyConversionContext als PolicyAssertionCollection-Objekte verfügbar gemacht. Jede PolicyAssertionCollection ist eine Auflistung von Richtlinienassertionen, die durch XmlElement-Objekte dargestellt wird.

Die Contract-Eigenschaft und die BindingElements-Eigenschaft des PolicyConversionContext-Objekts machen das ContractDescription-Objekt und das BindingElement-Objekt verfügbar, die aus der WSDL importiert wurden. Richtlinienassertionen werden von Richtlinienimporterweiterungen verarbeitet, indem Instanzen eines bestimmten Richtlinienassertionstyps gesucht und entsprechende Änderungen am ContractDescription-Objekt oder an BindingElement-Objekten vorgenommen und die Richtlinienassertionen anschließend aus der entsprechenden PolicyAssertionCollection-Instanz entfernt werden.

Das wsp:Optional-Attribut sowie geschachtelte Richtlinienausdrücke werden nicht normalisiert, sodass diese Richtlinienkonstrukte von Richtlinienimporterweiterungen behandelt werden müssen. Richtlinienimporterweiterungen können außerdem mehrmals mit dem gleichen ContractDescription- und BindingElement-Objekt aufgerufen werden, sodass Richtlinienimporterweiterungen diesem Verhalten gegenüber robust sein sollten.

Wichtig

Ungültige oder fehlerhafte Metadaten können an den Importer übergeben werden. Stellen Sie sicher, dass benutzerdefinierte Importer gegenüber allen Arten von XML robust sind.

Siehe auch