Overzicht van metagegevensarchitectuur
Windows Communication Foundation (WCF) biedt een uitgebreide infrastructuur voor het exporteren, publiceren, ophalen en importeren van servicemetagegevens. WCF-services gebruiken metagegevens om te beschrijven hoe ze kunnen communiceren met de eindpunten van de service, zodat hulpprogramma's, zoals Svcutil.exe, automatisch clientcode kunnen genereren voor toegang tot de service.
De meeste typen waaruit de WCF-metagegevensinfrastructuur bestaat, bevinden zich in de System.ServiceModel.Description naamruimte.
WCF gebruikt de ServiceEndpoint klasse om eindpunten in een service te beschrijven. U kunt WCF gebruiken om metagegevens voor service-eindpunten te genereren of servicemetagegevens te importeren om exemplaren te genereren ServiceEndpoint .
WCF vertegenwoordigt de metagegevens voor een service als een exemplaar van het MetadataSet type, waarvan de structuur sterk is gekoppeld aan de indeling voor serialisatie van metagegevens die is gedefinieerd in WS-MetadataExchange. Het MetadataSet type bundelt de werkelijke servicemetagegevens, zoals WSDL-documenten (Web Services Description Language), XML-schemadocumenten of WS-Policy-expressies, als een verzameling MetadataSection exemplaren. Elk System.ServiceModel.Description.MetadataSection exemplaar bevat een specifiek dialect voor metagegevens en een id. A System.ServiceModel.Description.MetadataSection kan de volgende items in MetadataSection.Metadata de eigenschap bevatten:
Onbewerkte metagegevens.
Een MetadataReference exemplaar.
Een MetadataLocation exemplaar.
Een System.ServiceModel.Description.MetadataReference exemplaar verwijst naar een ander MEX-eindpunt (Metadata Exchange) en System.ServiceModel.Description.MetadataLocation exemplaren verwijzen naar een metagegevensdocument met behulp van een HTTP-URL. WCF ondersteunt het gebruik van WSDL-documenten voor het beschrijven van service-eindpunten, servicecontracten, bindingen, berichtuitwisselingspatronen, berichten en foutberichten die door een service zijn geïmplementeerd. Gegevenstypen die door de service worden gebruikt, worden beschreven in WSDL-documenten met behulp van een XML-schema. Zie Schema importeren en exporteren voor meer informatie. U kunt WCF gebruiken om WSDL-extensies te exporteren en te importeren voor servicegedrag, contractgedrag en bindingselementen waarmee de functionaliteit van een service wordt uitgebreid. Zie Aangepaste metagegevens exporteren voor een WCF-extensie voor meer informatie.
Servicemetagegevens exporteren
In WCF is het exporteren van metagegevens het proces van het beschrijven van service-eindpunten en het projecteren ervan in een parallelle, gestandaardiseerde weergave die clients kunnen gebruiken om te begrijpen hoe de service moet worden gebruikt. Als u metagegevens wilt exporteren uit ServiceEndpoint exemplaren, gebruikt u een implementatie van de MetadataExporter abstracte klasse. Een System.ServiceModel.Description.MetadataExporter implementatie genereert metagegevens die zijn ingekapseld in een MetadataSet exemplaar.
De System.ServiceModel.Description.MetadataExporter klasse biedt een framework voor het genereren van beleidsexpressies die de mogelijkheden en vereisten van een eindpuntbinding en de bijbehorende bewerkingen, berichten en fouten beschrijven. Deze beleidsexpressies worden vastgelegd in een PolicyConversionContext exemplaar. Een System.ServiceModel.Description.MetadataExporter implementatie kan deze beleidsexpressies vervolgens koppelen aan de metagegevens die worden gegenereerd.
De System.ServiceModel.Description.MetadataExporter aanroepen naar elke System.ServiceModel.Channels.BindingElement die de IPolicyExportExtension interface implementeert in de binding van een ServiceEndpoint bij het genereren van een PolicyConversionContext object voor de System.ServiceModel.Description.MetadataExporter implementatie die moet worden gebruikt. U kunt nieuwe beleidsverklaringen exporteren door de IPolicyExportExtension interface op uw aangepaste implementaties van het BindingElement type te implementeren.
Het WsdlExporter type is de implementatie van de System.ServiceModel.Description.MetadataExporter abstracte klasse die is opgenomen in WCF. Het WsdlExporter type genereert WSDL-metagegevens met gekoppelde beleidsexpressies.
Als u aangepaste WSDL-metagegevens of WSDL-extensies wilt exporteren voor eindpuntgedrag, contractgedrag of bindingselementen in een service-eindpunt, kunt u de IWsdlExportExtension interface implementeren. Er WsdlExporter wordt gekeken naar een ServiceEndpoint exemplaar voor bindingselementen, bewerkingsgedrag, contractgedrag en eindpuntgedrag waarmee de IWsdlExportExtension interface wordt geïmplementeerd bij het genereren van het WSDL-document.
Metagegevens van de publicatieservice
WCF-services publiceren metagegevens door een of meer metagegevenseindpunten beschikbaar te maken. Metagegevens van publicerende services maken servicemetagegevens beschikbaar met behulp van gestandaardiseerde protocollen, zoals MEX- en HTTP/GET-aanvragen. Metagegevenseindpunten zijn vergelijkbaar met andere service-eindpunten omdat ze een adres, een binding en een contract hebben. U kunt metagegevenseindpunten toevoegen aan een servicehost in configuratie of in code.
Als u metagegevenseindpunten voor een WCF-service wilt publiceren, moet u eerst een exemplaar van het ServiceMetadataBehavior servicegedrag toevoegen aan de service. Als u een System.ServiceModel.Description.ServiceMetadataBehavior exemplaar aan uw service toevoegt, wordt uw service uitgebreid met de mogelijkheid om metagegevens te publiceren door een of meer metagegevenseindpunten weer te geven. Zodra u het System.ServiceModel.Description.ServiceMetadataBehavior servicegedrag hebt toegevoegd, kunt u metagegevenseindpunten beschikbaar maken die ondersteuning bieden voor het MEX-protocol of metagegevenseindpunten die reageren op HTTP/GET-aanvragen.
Als u metagegevenseindpunten wilt toevoegen die gebruikmaken van het MEX-protocol, voegt u service-eindpunten toe aan uw servicehost die gebruikmaken van het servicecontract met de naam IMetadataExchange.WCF, definieert u de IMetadataExchange interface met deze servicecontractnaam. WS-MetadataExchange-eindpunten of MEX-eindpunten kunnen een van de vier standaardbindingen gebruiken die worden weergegeven door de statische factory-methoden in de MetadataExchangeBindings klasse, zodat deze overeenkomen met de standaardbindingen die worden gebruikt door WCF-hulpprogramma's, zoals Svcutil.exe. U kunt MEX-metagegevenseindpunten ook configureren met behulp van een aangepaste binding.
Er ServiceMetadataBehavior wordt gebruikgemaakt van een System.ServiceModel.Description.WsdlExporter om metagegevens te exporteren voor alle service-eindpunten in uw service. Zie Exporteren en importeren van metagegevens voor meer informatie over het exporteren van metagegevens uit een service.
De ServiceMetadataBehavior servicehost wordt uitgebreid door een ServiceMetadataExtension exemplaar als een extensie toe te voegen aan uw servicehost. De System.ServiceModel.Description.ServiceMetadataExtension implementatie voor de protocollen voor het publiceren van metagegevens. U kunt de System.ServiceModel.Description.ServiceMetadataExtension metagegevens van de service ook tijdens runtime ophalen door toegang te krijgen tot de Metadata eigenschap.
Let op
Als u een MEX-eindpunt toevoegt aan uw toepassingsconfiguratiebestand en vervolgens probeert de ServiceMetadataBehavior aan uw servicehost toe te voegen in code, krijgt u de volgende uitzondering:
System.InvalidOperationException: de contractnaam 'IMetadataExchange' is niet gevonden in de lijst met contracten die door de service Service1 zijn geïmplementeerd. Voeg een ServiceMetadataBehavior toe aan het configuratiebestand of rechtstreeks aan De ServiceHost om ondersteuning voor dit contract in te schakelen.
U kunt dit probleem omzeilen door het ServiceMetadataBehavior in het configuratiebestand toe te voegen of zowel het eindpunt als ServiceMetadataBehavior de code toe te voegen.
Zie Aan de slag voor een voorbeeld van het toevoegen ServiceMetadataBehavior van een toepassingsconfiguratiebestand. Zie het voorbeeld self-host voor een voorbeeld van het toevoegen ServiceMetadataBehavior van code.
Let op
Bij het publiceren van metagegevens voor een service die twee verschillende servicecontracten weergeeft waarin elk een bewerking van dezelfde naam bevat, wordt er een uitzondering gegenereerd. Als u bijvoorbeeld een service hebt die een servicecontract beschikbaar maakt met de naam ICarService met een bewerking Get(Car c) en dezelfde service een servicecontract met de naam IBookService met een bewerking Get(Book b), wordt er een uitzondering gegenereerd of wordt er een foutbericht weergegeven bij het genereren van de metagegevens van de service. Ga op een van de volgende manieren te werk om dit probleem te omzeilen:
Servicemetagegevens ophalen
WCF kan servicemetagegevens ophalen met behulp van gestandaardiseerde protocollen zoals WS-MetadataExchange en HTTP. Beide protocollen worden ondersteund door het MetadataExchangeClient type. U haalt servicemetagegevens op met behulp van het System.ServiceModel.Description.MetadataExchangeClient type door een adres en een optionele binding op te geven. De binding die door een System.ServiceModel.Description.MetadataExchangeClient exemplaar wordt gebruikt, kan een van de standaardbindingen zijn uit de MetadataExchangeBindings statische klasse, een door de gebruiker geleverde binding of een binding die is geladen vanuit een eindpuntconfiguratie voor het IMetadataExchange
contract. De System.ServiceModel.Description.MetadataExchangeClient functie kan ook HTTP-URL-verwijzingen naar metagegevens omzetten met behulp van het HttpWebRequest type.
Een exemplaar is standaard System.ServiceModel.Description.MetadataExchangeClient gekoppeld aan één ChannelFactoryBase exemplaar. U kunt het ChannelFactoryBase exemplaar dat wordt gebruikt door een System.ServiceModel.Description.MetadataExchangeClient exemplaar wijzigen of vervangen door de GetChannelFactory virtuele methode te overschrijven. Op dezelfde manier kunt u het System.Net.HttpWebRequest exemplaar dat wordt gebruikt door een System.ServiceModel.Description.MetadataExchangeClient om HTTP/GET-aanvragen te maken, wijzigen of vervangen door de MetadataExchangeClient.GetWebRequest virtuele methode te overschrijven.
U kunt servicemetagegevens ophalen met behulp van WS-MetadataExchange- of HTTP/GET-aanvragen met behulp van het hulpprogramma Svcutil.exe en de schakeloptie /target:metadata en een adres doorgeven. Svcutil.exe downloadt de metagegevens op het opgegeven adres en slaat de bestanden op schijf op. Svcutil.exe intern een System.ServiceModel.Description.MetadataExchangeClient exemplaar gebruikt en een MEX-eindpuntconfiguratie laadt (uit het configuratiebestand van de toepassing) waarvan de naam overeenkomt met het schema van het adres dat is doorgegeven aan Svcutil.exe, indien aanwezig. Anders Svcutil.exe standaard een van de bindingen gebruikt die zijn gedefinieerd door het MetadataExchangeBindings type statische factory.
Metagegevens van service importeren
In WCF is het importeren van metagegevens het proces voor het genereren van een abstracte weergave van een service of onderdelen ervan op basis van de metagegevens. WCF kan bijvoorbeeld exemplaren, Binding exemplaren of ContractDescription exemplaren importeren ServiceEndpoint uit een WSDL-document voor een service. Als u servicemetagegevens wilt importeren in WCF, gebruikt u een implementatie van de MetadataImporter abstracte klasse. Typen die zijn afgeleid van de System.ServiceModel.Description.MetadataImporter klasse implementeren ondersteuning voor het importeren van metagegevensindelingen die gebruikmaken van de WS-Policy-importlogica in WCF.
Een System.ServiceModel.Description.MetadataImporter implementatie verzamelt de beleidsexpressies die zijn gekoppeld aan de metagegevens van de service in een PolicyConversionContext object. Vervolgens System.ServiceModel.Description.MetadataImporter worden de beleidsregels verwerkt als onderdeel van het importeren van de metagegevens door de implementaties van de IPolicyImportExtension interface in de PolicyImportExtensions eigenschap aan te roepen.
U kunt ondersteuning voor het importeren van nieuwe beleidsverklaringen toevoegen aan een System.ServiceModel.Description.MetadataImporter door uw eigen implementatie van de interface toe te voegen aan de IPolicyImportExtensionPolicyImportExtensions verzameling op een System.ServiceModel.Description.MetadataImporter exemplaar. U kunt uw beleidsimportextensie ook registreren in het configuratiebestand van de clienttoepassing.
Het System.ServiceModel.Description.WsdlImporter type is de implementatie van de System.ServiceModel.Description.MetadataImporter abstracte klasse die is opgenomen in WCF. Met het System.ServiceModel.Description.WsdlImporter type worden WSDL-metagegevens geïmporteerd met gekoppelde beleidsregels die zijn gebundeld in een MetadataSet object.
U kunt ondersteuning toevoegen voor het importeren van WSDL-extensies door de IWsdlImportExtension interface te implementeren en vervolgens uw implementatie toe te voegen aan de WsdlImportExtensions eigenschap op uw System.ServiceModel.Description.WsdlImporter exemplaar. Het System.ServiceModel.Description.WsdlImporter kan ook implementaties laden van de interface die is geregistreerd in het System.ServiceModel.Description.IWsdlImportExtension configuratiebestand van uw clienttoepassing.
Dynamische bindingen
U kunt de binding die u gebruikt om een kanaal te maken dynamisch bijwerken naar een service-eindpunt in het geval dat de binding voor het eindpunt verandert of u een kanaal wilt maken naar een eindpunt dat hetzelfde contract gebruikt, maar een andere binding heeft. U kunt de MetadataResolver statische klasse gebruiken om tijdens runtime metagegevens op te halen en te importeren voor service-eindpunten die een specifiek contract implementeren. Vervolgens kunt u de geïmporteerde System.ServiceModel.Description.ServiceEndpoint objecten gebruiken om een client of kanaalfactory te maken naar het gewenste eindpunt.