Freigeben über


Übersicht über die Metadatenarchitektur

Windows Communication Foundation (WCF) bietet eine umfangreiche Infrastruktur zum Exportieren, Veröffentlichen, Abrufen und Importieren von Dienstmetadaten. WCF-Dienste verwenden Metadaten, um die Interaktion mit den Endpunkten des Diensts zu beschreiben, sodass Tools wie Svcutil.exeautomatisch Clientcode für den Zugriff auf den Dienst generieren können.

Die meisten Typen, aus denen die WCF-Metadateninfrastruktur besteht, befinden sich im System.ServiceModel.Description Namespace.

WCF verwendet die ServiceEndpoint Klasse, um Endpunkte in einem Dienst zu beschreiben. Sie können WCF verwenden, um Metadaten für Dienstendpunkte zu erstellen oder Dienstmetadaten zu importieren, um ServiceEndpoint-Instanzen zu erzeugen.

WCF stellt die Metadaten für einen Dienst als Instanz des MetadataSet Typs dar, deren Struktur stark an das in WS-MetadataExchange definierte Metadaten serialisierungsformat gebunden ist. Der MetadataSet Typ bündelt die tatsächlichen Dienstmetadaten, z. B. WSDL-Dokumente (Web Services Description Language), XML-Schemadokumente oder WS-Policy Ausdrücke, als Sammlung von MetadataSection Instanzen. Jede System.ServiceModel.Description.MetadataSection Instanz enthält einen bestimmten Metadaten-Dialekt und einen Bezeichner. A System.ServiceModel.Description.MetadataSection kann die folgenden Elemente in seiner MetadataSection.Metadata Eigenschaft enthalten:

Eine System.ServiceModel.Description.MetadataReference Instanz verweist auf einen anderen MEX-Endpunkt (Metadata Exchange), und System.ServiceModel.Description.MetadataLocation Instanzen verweisen mithilfe einer HTTP-URL auf ein Metadatendokument. WCF unterstützt die Verwendung von WSDL-Dokumenten zur Beschreibung von Dienstendpunkten, Dienstverträgen, Bindungen, Nachrichtenaustauschmustern, Nachrichten und Von einem Dienst implementierten Fehlermeldungen. Vom Dienst verwendete Datentypen werden in WSDL-Dokumenten mithilfe des XML-Schemas beschrieben. Weitere Informationen finden Sie unter Schemaimport und -export. Sie können WCF verwenden, um WSDL-Erweiterungen für Dienstverhalten, Vertragsverhalten und Bindungselemente zu exportieren und zu importieren, die die Funktionalität eines Diensts erweitern. Weitere Informationen finden Sie unter Exportieren von benutzerdefinierten Metadaten für eine WCF-Erweiterung.

Exportieren von Dienstmetadaten

In WCF ist der Metadatenexport der Prozess der Beschreibung von Dienstendpunkten und das Projizieren in eine parallele, standardisierte Darstellung, die Clients verwenden können, um zu verstehen, wie der Dienst verwendet wird. Verwenden Sie zum Exportieren von Metadaten aus ServiceEndpoint Instanzen eine Implementierung der MetadataExporter abstrakten Klasse. Eine System.ServiceModel.Description.MetadataExporter Implementierung generiert Metadaten, die in einer MetadataSet Instanz gekapselt sind.

Die System.ServiceModel.Description.MetadataExporter Klasse bietet ein Framework zum Generieren von Richtlinienausdrücken, die die Funktionen und Anforderungen einer Endpunktbindung und der zugehörigen Vorgänge, Nachrichten und Fehler beschreiben. Diese Richtlinienausdrücke werden in einer PolicyConversionContext-Instanz aufgezeichnet. Eine System.ServiceModel.Description.MetadataExporter Implementierung kann diese Richtlinienausdrücke dann an die von ihr generierten Metadaten anfügen.

Der System.ServiceModel.Description.MetadataExporter ruft jedes System.ServiceModel.Channels.BindingElement-Objekt auf, das die IPolicyExportExtension-Schnittstelle in der Bindung eines ServiceEndpoint implementiert, wenn ein PolicyConversionContext-Objekt für die zu verwendende System.ServiceModel.Description.MetadataExporter-Implementierung erzeugt wird. Sie können neue Richtlinien assertionen exportieren, indem Sie die IPolicyExportExtension Schnittstelle für Ihre benutzerdefinierten Implementierungen des BindingElement Typs implementieren.

Der WsdlExporter Typ ist eine Implementierung der mit WCF enthaltenen abstrakten Klasse System.ServiceModel.Description.MetadataExporter. Der WsdlExporter Typ generiert WSDL-Metadaten mit angefügten Richtlinienausdrücken.

Um benutzerdefinierte WSDL-Metadaten oder WSDL-Erweiterungen für Endpunktverhalten, Vertragsverhalten oder Bindungselemente in einem Dienstendpunkt zu exportieren, können Sie die IWsdlExportExtension Schnittstelle implementieren. Der WsdlExporter untersucht eine ServiceEndpoint-Instanz daraufhin, ob sie Bindungselemente, Vorgangsverhalten, Vertragsverhalten und Endpunktverhalten enthält, die beim Erzeugen eines WSDL-Dokuments die IWsdlExportExtension-Schnittstelle implementieren.

Metadaten des Veröffentlichungsdiensts

WCF-Dienste veröffentlichen Metadaten, indem sie einen oder mehrere Metadatenendpunkte verfügbar geben. Veröffentlichungsdienstmetadaten stellen Dienstmetadaten mithilfe standardisierter Protokolle zur Verfügung, z. B. MEX- und HTTP/GET-Anforderungen. Metadatenendpunkte ähneln anderen Dienstendpunkten, dass sie über eine Adresse, eine Bindung und einen Vertrag verfügen. Sie können Metadaten-Endpunkte entweder in der Konfiguration oder im Code bei einem Diensthost hinzufügen.

Um Metadatenendpunkte für einen WCF-Dienst zu veröffentlichen, müssen Sie dem Dienst zuerst eine Instanz des ServiceMetadataBehavior Dienstverhaltens hinzufügen. Durch das Hinzufügen einer System.ServiceModel.Description.ServiceMetadataBehavior Instanz zu Ihrem Dienst wird Ihr Dienst um die Möglichkeit erweitert, Metadaten zu veröffentlichen, indem ein oder mehrere Metadatenendpunkte verfügbar sind. Nachdem Sie das System.ServiceModel.Description.ServiceMetadataBehavior Dienstverhalten hinzugefügt haben, können Sie Metadatenendpunkte verfügbar machen, die das MEX-Protokoll oder metadatenendpunkte unterstützen, die auf HTTP/GET-Anforderungen reagieren.

Um Metadatenendpunkte hinzuzufügen, die das MEX-Protokoll verwenden, fügen Sie Ihrem Diensthost Dienstendpunkte hinzu, die den Dienstvertrag mit dem Namen „IMetadataExchange“ verwenden. WCF definiert die IMetadataExchange-Schnittstelle mit diesem Dienstvertragsnamen. WS-MetadataExchange-Endpunkte oder MEX-Endpunkte können eine der vier Standardbindungen nutzen, die von den statischen Factorymethoden der MetadataExchangeBindings-Klasse verfügbar gemacht werden, sodass eine Anpassung an die von den WCF-Tools, wie „Svcutil.exe“, verwendeten Standardbindungen erreicht wird. Sie können auch MEX-Metadatenendpunkte mithilfe einer benutzerdefinierten Bindung konfigurieren.

Das ServiceMetadataBehavior verwendet einen System.ServiceModel.Description.WsdlExporter, um Metadaten für alle Dienstendpunkte in den Dienst zu exportieren. Weitere Informationen zum Exportieren von Metadaten aus einem Dienst finden Sie unter Exportieren und Importieren von Metadaten.

Das ServiceMetadataBehavior ergänzt den Diensthost, indem eine ServiceMetadataExtension-Instanz als Erweiterung dem Diensthost hinzugefügt wird. Dies System.ServiceModel.Description.ServiceMetadataExtension stellt die Implementierung für die Metadatenveröffentlichungsprotokolle bereit. Sie können die Metadaten des Dienstes auch zur Laufzeit abrufen, indem Sie auf die Eigenschaft Metadata zugreifen.

Vorsicht

Wenn Sie einen MEX-Endpunkt in Ihrer Anwendungskonfigurationsdatei hinzufügen und dann versuchen, ServiceMetadataBehavior zu Ihrem Diensthost im Code hinzuzufügen, erhalten Sie die folgende Ausnahme:

System.InvalidOperationException: Der Vertragsname 'IMetadataExchange' konnte nicht in der Liste der Verträge gefunden werden, die vom Dienst Service1 implementiert wurden. Fügen Sie der Konfigurationsdatei oder dem ServiceHost direkt einen ServiceMetadataBehavior hinzu, um den Support für diesen Vertrag zu aktivieren.

Sie können dieses Problem umgehen, indem Sie entweder ServiceMetadataBehavior zur Konfigurationsdatei hinzufügen oder sowohl den Endpunkt als auch ServiceMetadataBehavior im Code hinzufügen.

Ein Beispiel zum Hinzufügen ServiceMetadataBehavior einer Anwendungskonfigurationsdatei finden Sie unter " Erste Schritte". Ein Beispiel für das Hinzufügen von ServiceMetadataBehavior in den Code finden Sie im Self-Host-Beispiel.

Vorsicht

Beim Veröffentlichen von Metadaten für einen Dienst, der zwei verschiedene Dienstverträge verfügbar macht, in denen jeder einen Vorgang mit demselben Namen enthält, wird eine Ausnahme ausgelöst. Wenn Sie z. B. über einen Dienst verfügen, der einen Dienstvertrag namens "ICarService" verfügbar macht, der über einen Vorgang "Get(Car c)" verfügt und derselbe Dienst einen Dienstvertrag mit dem Namen "IBookService" verfügbar macht, der einen Vorgang "Get(Book b) aufweist, wird eine Ausnahme ausgelöst, oder beim Generieren der Metadaten des Diensts wird eine Fehlermeldung angezeigt. Führen Sie eine der folgenden Aktionen aus, um dieses Problem zu umgehen:

  • Benennen Sie einen der Vorgänge um.
  • Ändern Sie den Name auf einen anderen Namen.
  • Legen Sie einen der Namespaces des Vorgangs mithilfe der Namespace Eigenschaft auf einen anderen Namespace fest.

Abrufen von Dienstmetadaten

WCF kann Dienstmetadaten mithilfe standardisierter Protokolle wie WS-MetadataExchange und HTTP abrufen. Beide Protokolle werden vom MetadataExchangeClient Typ unterstützt. Sie rufen Dienstmetadaten mithilfe des System.ServiceModel.Description.MetadataExchangeClient Typs ab, indem Sie eine Adresse und eine optionale Bindung angeben. Die von einer System.ServiceModel.Description.MetadataExchangeClient Instanz verwendete Bindung kann eine der Standardbindungen aus der MetadataExchangeBindings statischen Klasse, eine vom Benutzer bereitgestellte Bindung oder eine aus einer Endpunktkonfiguration für den IMetadataExchange Vertrag geladene Bindung sein. System.ServiceModel.Description.MetadataExchangeClient kann auch HTTP-URL-Verweise auf Metadaten mithilfe des HttpWebRequest Typs auflösen.

Standardmäßig ist eine System.ServiceModel.Description.MetadataExchangeClient Instanz an eine einzelne ChannelFactoryBase Instanz gebunden. Sie können die Instanz von ChannelFactoryBase ändern oder ersetzen, die von einer System.ServiceModel.Description.MetadataExchangeClient verwendet wird, indem Sie die virtuelle Methode GetChannelFactory überschreiben. Ebenso können Sie die Instanz ändern oder ersetzen, die von System.Net.HttpWebRequest zum Erstellen von HTTP/GET-Anforderungen verwendet wird, indem Sie die System.ServiceModel.Description.MetadataExchangeClient virtuelle Methode überschreiben.

Sie können Dienstmetadaten mithilfe von WS-MetadataExchange- oder HTTP/GET-Anforderungen abrufen, indem Sie das tool Svcutil.exe verwenden und den Switch "/target:metadata" und eine Adresse übergeben. Svcutil.exe lädt die Metadaten an der angegebenen Adresse herunter und speichert die Dateien auf dem Datenträger. Svcutil.exe verwendet eine System.ServiceModel.Description.MetadataExchangeClient Instanz intern und lädt eine MEX-Endpunktkonfiguration (aus der Anwendungskonfigurationsdatei), deren Name dem Schema der an Svcutil.exeübergebenen Adresse entspricht, sofern vorhanden. Andernfalls verwendet Svcutil.exe standardmäßig eine der Bindungen, die durch den statischen MetadataExchangeBindings-Factorytyp definiert werden.

Importieren von Dienstmetadaten

In WCF ist der Metadatenimport der Prozess des Generierens einer abstrakten Darstellung eines Diensts oder seiner Komponententeile aus seinen Metadaten. Beispielsweise kann WCF ServiceEndpoint-, Binding- und ContractDescription-Instanzen aus einem WSDL-Dokument für einen Dienst importieren. Verwenden Sie zum Importieren von Dienstmetadaten in WCF eine Implementierung der MetadataImporter abstrakten Klasse. Typen, die von der System.ServiceModel.Description.MetadataImporter Klasse abgeleitet werden, implementieren unterstützung für das Importieren von Metadatenformaten, die die WS-Policy Importlogik in WCF nutzen.

Eine System.ServiceModel.Description.MetadataImporter Implementierung sammelt die Richtlinienausdrücke, die den Dienstmetadaten in einem PolicyConversionContext Objekt zugeordnet sind. System.ServiceModel.Description.MetadataImporter führt dann die Verarbeitung der Richtlinien als Teil des Importierens der Metadaten durch, indem die Implementierungen der IPolicyImportExtension Schnittstelle in der PolicyImportExtensions Eigenschaft aufgerufen werden.

Sie können Unterstützung für das Importieren neuer Policy-Assertionen zu einem System.ServiceModel.Description.MetadataImporter hinzufügen, indem Sie Ihre eigene Implementierung der IPolicyImportExtension-Schnittstelle zur PolicyImportExtensions-Sammlung einer System.ServiceModel.Description.MetadataImporter-Instanz hinzufügen. Alternativ können Sie die Richtlinienimporterweiterung in ihrer Clientanwendungskonfigurationsdatei registrieren.

Der System.ServiceModel.Description.WsdlImporter Typ ist eine Implementierung der mit WCF enthaltenen abstrakten Klasse System.ServiceModel.Description.MetadataImporter. Der System.ServiceModel.Description.WsdlImporter Typ importiert WSDL-Metadaten mit angefügten Richtlinien, die in einem MetadataSet Objekt gebündelt sind.

Sie können Unterstützung für das Importieren von WSDL-Erweiterungen hinzufügen, indem Sie die IWsdlImportExtension Schnittstelle implementieren und die Implementierung dann der WsdlImportExtensions Eigenschaft in Ihrer System.ServiceModel.Description.WsdlImporter Instanz hinzufügen. Das System.ServiceModel.Description.WsdlImporter kann auch Implementierungen der System.ServiceModel.Description.IWsdlImportExtension-Schnittstelle laden, die in Ihrer Clientanwendungskonfigurationsdatei registriert sind.

Dynamische Bindungen

Sie können die Bindung dynamisch aktualisieren, die Sie zum Erstellen eines Kanals zu einem Dienstendpunkt verwenden, wenn sich die Bindung für den Endpunkt ändert oder Sie einen Kanal zu einem Endpunkt erstellen möchten, der denselben Vertrag verwendet, aber eine andere Bindung hat. Sie können die MetadataResolver statische Klasse verwenden, um Metadaten zur Laufzeit für Dienstendpunkte abzurufen und zu importieren, die einen bestimmten Vertrag implementieren. Mit den importierten System.ServiceModel.Description.ServiceEndpoint-Objekten können Sie einen Client oder eine Kanalfactory für den gewünschten Endpunkt erstellen.

Siehe auch