Dela via


Översikt över metadataarkitektur

Windows Communication Foundation (WCF) tillhandahåller en omfattande infrastruktur för export, publicering, hämtning och import av tjänstmetadata. WCF-tjänster använder metadata för att beskriva hur du interagerar med tjänstens slutpunkter så att verktyg, till exempel Svcutil.exe, automatiskt kan generera klientkod för åtkomst till tjänsten.

De flesta av de typer som utgör WCF-metadatainfrastrukturen System.ServiceModel.Description finns i namnområdet.

WCF använder ServiceEndpoint klassen för att beskriva slutpunkter i en tjänst. Du kan använda WCF för att generera metadata för tjänstslutpunkter eller importera tjänstmetadata för att generera ServiceEndpoint instanser.

WCF representerar metadata för en tjänst som en instans av MetadataSet typen, vars struktur är starkt kopplad till det metadata-serialiseringsformat som definierats i WS-MetadataExchange. Typen MetadataSet paketar de faktiska tjänstmetadata, till exempel WSDL-dokument (Web Services Description Language), XML-schemadokument eller WS-Policy uttryck, som en samling MetadataSection instanser. Varje System.ServiceModel.Description.MetadataSection instans innehåller en specifik metadatadialekt och en identifierare. A System.ServiceModel.Description.MetadataSection kan innehålla följande objekt i dess MetadataSection.Metadata egenskap:

En System.ServiceModel.Description.MetadataReference instans pekar på en annan MEX-slutpunkt (Metadata Exchange) och System.ServiceModel.Description.MetadataLocation instanser pekar på ett metadatadokument med hjälp av en HTTP-URL. WCF stöder användning av WSDL-dokument för att beskriva tjänstslutpunkter, tjänstkontrakt, bindningar, mönster för meddelandeutbyte, meddelanden och felmeddelanden som implementeras av en tjänst. Datatyper som används av tjänsten beskrivs i WSDL-dokument med hjälp av XML-schema. Mer information finns i Schemaimport och export. Du kan använda WCF för att exportera och importera WSDL-tillägg för tjänstbeteende, kontraktsbeteenden och bindningselement som utökar funktionerna i en tjänst. Mer information finns i Exportera anpassade metadata för ett WCF-tillägg.

Exportera tjänstmetadata

I WCF är metadataexport processen för att beskriva tjänstslutpunkter och projicera dem i en parallell, standardiserad representation som klienter kan använda för att förstå hur tjänsten ska användas. Om du vill exportera metadata från ServiceEndpoint instanser använder du en implementering av den MetadataExporter abstrakta klassen. En System.ServiceModel.Description.MetadataExporter implementering genererar metadata som kapslas in i en MetadataSet instans.

Klassen System.ServiceModel.Description.MetadataExporter tillhandahåller ett ramverk för att generera principuttryck som beskriver funktionerna och kraven för en slutpunktsbindning och dess associerade åtgärder, meddelanden och fel. Dessa principuttryck samlas in i en PolicyConversionContext instans. En System.ServiceModel.Description.MetadataExporter implementering kan sedan koppla dessa principuttryck till de metadata som genereras.

Anropet System.ServiceModel.Description.MetadataExporter till varje System.ServiceModel.Channels.BindingElement som implementerar IPolicyExportExtension-gränssnittet i bindningen av en ServiceEndpoint när ett PolicyConversionContext-objekt genereras för att implementeringen ska kunna använda System.ServiceModel.Description.MetadataExporter. Du kan exportera nya policyuttryck genom att implementera gränssnittet IPolicyExportExtension i dina anpassade implementeringar av typen BindingElement.

Typen WsdlExporter är implementeringen av den System.ServiceModel.Description.MetadataExporter abstrakta klass som ingår i WCF. Typen WsdlExporter genererar WSDL-metadata med kopplade principuttryck.

Om du vill exportera anpassade WSDL-metadata eller WSDL-tillägg för slutpunktsbeteenden, kontraktsbeteenden eller bindningselement i en tjänstslutpunkt kan du implementera IWsdlExportExtension gränssnittet. Det WsdlExporter granskar en ServiceEndpoint instans för bindningselement, operativa beteenden, kontraktsbeteenden och slutpunktsbeteenden som implementerar IWsdlExportExtension gränssnittet när WSDL-dokumentet genereras.

Metadata för publiceringstjänsten

WCF-tjänster publicerar metadata genom att exponera en eller flera metadataslutpunkter. Metadata för publiceringstjänsten gör tjänstmetadata tillgängliga med hjälp av standardiserade protokoll, till exempel MEX- och HTTP/GET-begäranden. Metadataslutpunkter liknar andra tjänstslutpunkter eftersom de har en adress, en bindning och ett kontrakt. Du kan lägga till metadataslutpunkter till en tjänstvärd i konfigurationen eller i kod.

Om du vill publicera metadataslutpunkter för en WCF-tjänst måste du först lägga till en instans av ServiceMetadataBehavior tjänstens beteende i tjänsten. Genom att lägga till en System.ServiceModel.Description.ServiceMetadataBehavior instans i tjänsten utökas tjänsten med möjligheten att publicera metadata genom att exponera en eller flera metadataslutpunkter. När du lägger till System.ServiceModel.Description.ServiceMetadataBehavior tjänstbeteendet kan du sedan exponera metadataslutpunkter som stöder MEX-protokollet eller metadataslutpunkter som svarar på HTTP/GET-begäranden.

Om du vill lägga till metadataslutpunkter som använder MEX-protokollet, ska du lägga till tjänstslutpunkter till värd för tjänsten som använder tjänstkontraktet med namnet IMetadataExchange. I WCF definieras IMetadataExchange gränssnittet som har det här tjänstkontraktsnamnet. WS-MetadataExchange slutpunkter, eller MEX-slutpunkter, kan använda en av de fyra standardbindningar som exponeras av statiska fabriksmetoder i MetadataExchangeBindings klassen för att matcha standardbindningar som används av WCF-verktyg, till exempel Svcutil.exe. Du kan också konfigurera MEX-metadataslutpunkter med hjälp av en anpassad bindning.

ServiceMetadataBehavior Använder en System.ServiceModel.Description.WsdlExporter för att exportera metadata för alla tjänstslutpunkter i din tjänst. Mer information om hur du exporterar metadata från en tjänst finns i Exportera och importera metadata.

Utökar ServiceMetadataBehavior tjänstvärden genom att lägga till en ServiceMetadataExtension instans som ett tillägg till tjänstvärden. System.ServiceModel.Description.ServiceMetadataExtension Tillhandahåller implementeringen för protokollen för metadatapublicering. Du kan också använda System.ServiceModel.Description.ServiceMetadataExtension för att hämta tjänstens metadata vid körning genom att komma åt Metadata-egenskapen.

Försiktighet

Om du lägger till en MEX-slutpunkt i programkonfigurationsfilen och sedan försöker lägga till ServiceMetadataBehavior till värden för din tjänst i koden får du följande undantag:

System.InvalidOperationException: Det gick inte att hitta kontraktsnamnet "IMetadataExchange" i listan över kontrakt som implementerats av tjänsten Service1. Lägg till en ServiceMetadataBehavior i konfigurationsfilen eller till ServiceHost direkt för att aktivera stöd för det här kontraktet.

Du kan kringgå det här problemet genom att antingen lägga till ServiceMetadataBehavior i konfigurationsfilen eller lägga till både slutpunkten och ServiceMetadataBehavior i koden.

Ett exempel på hur du lägger till ServiceMetadataBehavior i en programkonfigurationsfil finns i Komma igång. Ett exempel på hur du lägger till ServiceMetadataBehavior i koden finns i exemplet Self-Host.

Försiktighet

När du publicerar metadata för en tjänst som exponerar två olika tjänstkontrakt där var och en innehåller en åtgärd med samma namn genereras ett undantag. Om du till exempel har en tjänst som exponerar ett tjänstkontrakt med namnet ICarService som har en åtgärd Get(Car c) och samma tjänst exponerar ett tjänstkontrakt med namnet IBookService som har en åtgärd Get(Book b), utlöses ett undantag eller ett felmeddelande visas när tjänstens metadata genereras. Du kan undvika det här problemet genom att göra något av följande:

  • Byt namn på en av åtgärderna.
  • Ändra namnet på Name till något annat.
  • Ange ett av åtgärdernas namnområden till ett annat namnområde med hjälp av Namespace egenskapen .

Hämtar tjänstmetadata

WCF kan hämta tjänstmetadata med hjälp av standardiserade protokoll som WS-MetadataExchange och HTTP. Båda dessa protokoll stöds av typen MetadataExchangeClient . Du hämtar tjänstmetadata med hjälp System.ServiceModel.Description.MetadataExchangeClient av typen genom att ange en adress och en valfri bindning. Bindningen som används av en System.ServiceModel.Description.MetadataExchangeClient instans kan vara en av standardbindningarna från den MetadataExchangeBindings statiska klassen, en bindning från användaren eller en bindning som läses in från en slutpunktskonfiguration för IMetadataExchange kontraktet. System.ServiceModel.Description.MetadataExchangeClient kan också lösa HTTP-URL-referenser till metadata med hjälp av HttpWebRequest-typ.

Som standard är en System.ServiceModel.Description.MetadataExchangeClient instans kopplad till en enda ChannelFactoryBase instans. Du kan ändra eller ersätta den ChannelFactoryBase instans som används av en System.ServiceModel.Description.MetadataExchangeClient genom att åsidosätta den GetChannelFactory virtuella metoden. På samma sätt kan du ändra eller ersätta den System.Net.HttpWebRequest instans som används av en System.ServiceModel.Description.MetadataExchangeClient för att göra HTTP/GET-begäranden genom att åsidosätta den MetadataExchangeClient.GetWebRequest virtuella metoden.

Du kan hämta tjänstmetadata med WS-MetadataExchange- eller HTTP/GET-begäranden genom att använda verktyget Svcutil.exe och ange flaggan /target:metadata samt en adress. Svcutil.exe laddar ned metadata på den angivna adressen och sparar filerna på disken. Svcutil.exe använder en System.ServiceModel.Description.MetadataExchangeClient instans internt och läser in en MEX-slutpunktskonfiguration (från programkonfigurationsfilen) vars namn matchar schemat för den adress som skickas till Svcutil.exe, om det finns en sådan. Annars använder Svcutil.exe som standard någon av bindningarna som definieras av den MetadataExchangeBindings statiska fabrikstypen.

Importera tjänstmetadata

I WCF är metadataimport processen för att generera en abstrakt representation av en tjänst eller dess komponentdelar från dess metadata. WCF kan till exempel importera ServiceEndpoint instanser, Binding instanser eller ContractDescription instanser från ett WSDL-dokument för en tjänst. Om du vill importera tjänstmetadata i WCF använder du en implementering av den MetadataImporter abstrakta klassen. Typer som härleds från System.ServiceModel.Description.MetadataImporter klassen implementerar stöd för import av metadataformat som utnyttjar WS-Policy importlogik i WCF.

En System.ServiceModel.Description.MetadataImporter implementering samlar in de principuttryck som är kopplade till tjänstens metadata i ett PolicyConversionContext objekt. System.ServiceModel.Description.MetadataImporter bearbetar policyerna som en del av att importera metadatan genom att anropa implementationerna av IPolicyImportExtension-gränssnittet i PolicyImportExtensions-egenskapen.

Du kan lägga till stöd för att importera nya policyuttryck till en System.ServiceModel.Description.MetadataImporter genom att lägga till en egen implementering av gränssnittet IPolicyImportExtension i samlingen PolicyImportExtensions på en instans av System.ServiceModel.Description.MetadataImporter. Du kan också registrera ditt principimporttillägg i konfigurationsfilen för klientprogrammet.

Typen System.ServiceModel.Description.WsdlImporter är implementeringen av den System.ServiceModel.Description.MetadataImporter abstrakta klass som ingår i WCF. Typen System.ServiceModel.Description.WsdlImporter importerar WSDL-metadata med anslutna principer som paketeras i ett MetadataSet objekt.

Du kan lägga till stöd för att importera WSDL-tillägg genom att implementera IWsdlImportExtension gränssnittet och sedan lägga till implementeringen i WsdlImportExtensions egenskapen på din System.ServiceModel.Description.WsdlImporter instans. System.ServiceModel.Description.WsdlImporter kan också läsa in implementeringar för System.ServiceModel.Description.IWsdlImportExtension-gränssnittet som har registrerats i klientprogrammets konfigurationsfil.

Dynamiska bindningar

Du kan dynamiskt uppdatera bindningen som du använder för att skapa en kanal till en tjänstslutpunkt om bindningen för slutpunkten ändras eller om du vill skapa en kanal till en slutpunkt som använder samma kontrakt men har en annan bindning. Du kan använda den MetadataResolver statiska klassen för att hämta och importera metadata vid körning för tjänstslutpunkter som implementerar ett specifikt kontrakt. Du kan sedan använda de importerade System.ServiceModel.Description.ServiceEndpoint objekten för att skapa en klient eller kanalfabrik till önskad slutpunkt.

Se även