Share via


Importieren von benutzerdefinierten Metadaten für eine WCF-Erweiterung

In Windows Communication Foundation (WCF) wird beim Importieren von Metadaten eine abstrakte Darstellung eines Diensts oder seiner Komponenten aus dessen Metadaten generiert. 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 Verwendung von Typen, die Metadaten – egal, ob benutzerdefiniert oder systemeigen – 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 Importer 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 über das Exportieren von benutzerdefinierter WSDL und benutzerdefinierten Richtlinienassertionen 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 Gewusst wie: 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 System.ServiceModel.Description.IPolicyImportExtension.ImportPolicy(System.ServiceModel.Description.MetadataImporter,System.ServiceModel.Description.PolicyConversionContext)-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.

Tipp

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

Aufgaben

Gewusst wie: Importieren von benutzerdefinierter WSDL
Gewusst wie: Importieren von benutzerdefinierten Richtlinienassertionen
Gewusst wie: Schreiben einer Erweiterung für den ServiceContractGenerator