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.

Anropen System.ServiceModel.Description.MetadataExporter till var och System.ServiceModel.Channels.BindingElement en som implementerar IPolicyExportExtension gränssnittet i bindningen av en ServiceEndpoint när du genererar ett PolicyConversionContext objekt som implementeringen System.ServiceModel.Description.MetadataExporter ska använda. Du kan exportera nya principkontroller genom att implementera IPolicyExportExtension gränssnittet på 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. Tittar WsdlExporter på en ServiceEndpoint instans för bindningselement, åtgärdsbeteenden, 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 koden.

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 lägger du till tjänstslutpunkter till tjänstvärden som använder tjänstkontraktet med namnet IMetadataExchange.WCF definierar 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 standardbindningarna 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 Metadata komma åt egenskapen.

Varning

Om du lägger till en MEX-slutpunkt i programkonfigurationsfilen och sedan försöker lägga ServiceMetadataBehavior till till tjänstvärden i kod 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 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 kod finns i exemplet Självvärd .

Varning

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.
  • Name Ange ett annat namn.
  • 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å matcha HTTP-URL-referenser till metadata med hjälp av HttpWebRequest typen .

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 hjälp av WS-MetadataExchange- eller HTTP/GET-begäranden med hjälp av verktyget Svcutil.exe och skicka växeln /target:metadata och 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 drar nytta av WS-policyns importlogik i WCF.

En System.ServiceModel.Description.MetadataImporter implementering samlar in de principuttryck som är kopplade till tjänstens metadata i ett PolicyConversionContext objekt. Sedan System.ServiceModel.Description.MetadataImporter bearbetas principerna som en del av importen av metadata genom att anropa implementeringarna av IPolicyImportExtension gränssnittet i PolicyImportExtensions egenskapen.

Du kan lägga till stöd för att importera nya principkontroller till en System.ServiceModel.Description.MetadataImporter genom att lägga till din egen implementering av IPolicyImportExtension gränssnittet i PolicyImportExtensions samlingen på en System.ServiceModel.Description.MetadataImporter instans. 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 av System.ServiceModel.Description.IWsdlImportExtension gränssnittet som 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