Přehled architektury metadat
Windows Communication Foundation (WCF) poskytuje bohatou infrastrukturu pro export, publikování, načítání a import metadat služby. Služby WCF používají metadata k popisu interakce s koncovými body služby, aby nástroje, například Svcutil.exe, mohly automaticky generovat klientský kód pro přístup ke službě.
Většina typů, které tvoří infrastrukturu metadat WCF, se nachází v System.ServiceModel.Description oboru názvů.
WCF používá ServiceEndpoint třídu k popisu koncových bodů ve službě. Pomocí WCF můžete generovat metadata pro koncové body služby nebo importovat metadata služby ke generování ServiceEndpoint instancí.
WCF představuje metadata pro službu jako instanci MetadataSet typu, což je struktura, která je silně svázaná s formátem serializace metadat definovaným ve WS-MetadataExchange. Tento MetadataSet typ sbalí skutečná metadata služby, jako jsou dokumenty WSDL (Web Services Description Language), dokumenty schématu XML nebo výrazy WS-Policy jako kolekce MetadataSection instancí. Každá System.ServiceModel.Description.MetadataSection instance obsahuje konkrétní dialekt metadat a identifikátor. A System.ServiceModel.Description.MetadataSection může obsahovat následující položky ve své MetadataSection.Metadata vlastnosti:
Nezpracovaná metadata
Instance MetadataReference .
Instance MetadataLocation .
System.ServiceModel.Description.MetadataReference Instance odkazují na jiný koncový bod výměny metadat (MEX) a System.ServiceModel.Description.MetadataLocation instance odkazují na dokument metadat pomocí adresy URL PROTOKOLU HTTP. WCF podporuje použití dokumentů WSDL k popisu koncových bodů služby, kontraktů služeb, vazeb, vzorů výměny zpráv, zpráv a chybových zpráv implementovaných službou. Datové typy používané službou jsou popsány v dokumentech WSDL pomocí schématu XML. Další informace naleznete v tématu Import a export schématu. WCF můžete použít k exportu a importu rozšíření WSDL pro chování služby, chování kontraktů a vazeb prvků, které rozšiřují funkce služby. Další informace naleznete v tématu Export vlastních metadat pro rozšíření WCF.
Export metadat služby
Export metadat ve WCF je proces popisu koncových bodů služby a jejich promítání do paralelní standardizované reprezentace, kterou můžou klienti použít k pochopení toho, jak službu používat. K exportu metadat z ServiceEndpoint instancí použijte implementaci MetadataExporter abstraktní třídy. Implementace System.ServiceModel.Description.MetadataExporter generuje metadata zapouzdřená v MetadataSet instanci.
Třída System.ServiceModel.Description.MetadataExporter poskytuje architekturu pro generování výrazů zásad, které popisují možnosti a požadavky vazby koncového bodu a související operace, zprávy a chyby. Tyto výrazy zásad se zaznamenávají v PolicyConversionContext instanci. Implementace System.ServiceModel.Description.MetadataExporter pak může tyto výrazy zásad připojit k metadatům, která generuje.
Volání System.ServiceModel.Description.MetadataExporter do každého System.ServiceModel.Channels.BindingElement , který implementuje IPolicyExportExtension rozhraní ve vazbě objektu ServiceEndpointPolicyConversionContext pro implementaci System.ServiceModel.Description.MetadataExporter použít. Nové kontrolní výrazy zásad můžete exportovat implementací IPolicyExportExtension rozhraní ve vlastních implementacích BindingElement typu.
Typ WsdlExporter je implementace System.ServiceModel.Description.MetadataExporter abstraktní třídy, která je součástí WCF. Typ WsdlExporter generuje metadata WSDL s připojenými výrazy zásad.
Pokud chcete exportovat vlastní metadata WSDL nebo rozšíření WSDL pro chování koncových bodů, chování kontraktů nebo vazby prvků v koncovém bodu služby, můžete rozhraní implementovat IWsdlExportExtension . Podívá WsdlExporter se na ServiceEndpoint instanci pro prvky vazby, chování operací, chování kontraktů a chování koncových bodů, které implementují IWsdlExportExtension rozhraní při generování dokumentu WSDL.
Metadata služby publikování
Služby WCF publikují metadata zveřejněním jednoho nebo více koncových bodů metadat. Metadata služby publikování zpřístupňuje metadata služby pomocí standardizovaných protokolů, jako jsou MEX a požadavky HTTP/GET. Koncové body metadat jsou podobné jiným koncovým bodům služby, ve kterých mají adresu, vazbu a kontrakt. Koncové body metadat můžete přidat do hostitele služby v konfiguraci nebo v kódu.
Pokud chcete publikovat koncové body metadat pro službu WCF, musíte nejprve do služby přidat instanci ServiceMetadataBehavior chování služby. System.ServiceModel.Description.ServiceMetadataBehavior Přidání instance do služby rozšiřuje vaši službu o možnost publikovat metadata zveřejněním jednoho nebo více koncových bodů metadat. Po přidání System.ServiceModel.Description.ServiceMetadataBehavior chování služby pak můžete zveřejnit koncové body metadat, které podporují koncové body protokolu MEX nebo koncových bodů metadat, které reagují na požadavky HTTP/GET.
Pokud chcete přidat koncové body metadat, které používají protokol MEX, přidejte koncové body služby do hostitele služby, který používá kontrakt služby s názvem IMetadataExchange.WCF, definuje IMetadataExchange rozhraní, které má tento název kontraktu služby. Koncové body WS-MetadataExchange nebo koncové body MEX mohou použít jednu ze čtyř výchozích vazeb vystavených statickými metodami továrny ve MetadataExchangeBindings třídě tak, aby odpovídaly výchozím vazbám používaným nástroji WCF, jako je například Svcutil.exe. Koncové body metadat MEX můžete také nakonfigurovat pomocí vlastní vazby.
Používá ServiceMetadataBehaviorSystem.ServiceModel.Description.WsdlExporter k exportu metadat pro všechny koncové body služby ve vaší službě. Další informace o exportu metadat ze služby najdete v tématu Export a import metadat.
Rozšíří ServiceMetadataBehavior hostitele služby přidáním ServiceMetadataExtension instance jako rozšíření hostitele služby. Poskytuje System.ServiceModel.Description.ServiceMetadataExtension implementaci protokolů publikování metadat. Můžete také použít System.ServiceModel.Description.ServiceMetadataExtension k získání metadat služby za běhu přístupem k Metadata vlastnosti.
Upozornění
Pokud do konfiguračního souboru aplikace přidáte koncový bod MEX a pak se pokusíte přidat ServiceMetadataBehavior hostitele služby v kódu, zobrazí se následující výjimka:
System.InvalidOperationException: Název kontraktu IMetadataExchange nebyl nalezen v seznamu kontraktů implementovaných službou Service1. Přidejte ServiceMetadataBehavior do konfiguračního souboru nebo do ServiceHost přímo za účelem povolení podpory pro tento kontrakt.
Tento problém můžete vyřešit tak, že přidáte ServiceMetadataBehavior do konfiguračního souboru nebo přidáte koncový bod i ServiceMetadataBehavior kód.
Příklad přidání ServiceMetadataBehavior do konfiguračního souboru aplikace najdete v části Začínáme. Příklad přidání ServiceMetadataBehavior do kódu najdete v ukázce samoobslužného hostitele .
Upozornění
Při publikování metadat pro službu, která zveřejňuje dva různé kontrakty služeb, ve kterých každá obsahuje operaci se stejným názvem, je vyvolána výjimka. Pokud máte například službu, která zveřejňuje kontrakt služby s názvem ICarService, který má operaci Get(Car c) a stejná služba zveřejňuje kontrakt služby s názvem IBookService, který má operaci Get(Book b), vyvolá se výjimka nebo se při generování metadat služby zobrazí chybová zpráva. Pokud chcete tento problém vyřešit, udělejte jednu z těchto věcí:
Načítání metadat služby
WCF může načítat metadata služby pomocí standardizovaných protokolů, jako je WS-MetadataExchange a HTTP. Oba tyto protokoly jsou podporovány typem MetadataExchangeClient . Metadata služby načtete pomocí System.ServiceModel.Description.MetadataExchangeClient typu zadáním adresy a volitelné vazby. Vazba používaná System.ServiceModel.Description.MetadataExchangeClient instancí může být jednou z výchozích vazeb ze MetadataExchangeBindings statické třídy, vazby zadané uživatelem nebo vazby načtené z konfigurace koncového bodu pro IMetadataExchange
kontrakt. Pomocí System.ServiceModel.Description.MetadataExchangeClient typu HttpWebRequest lze také přeložit odkazy na adresu URL HTTP na metadata.
Ve výchozím nastavení System.ServiceModel.Description.MetadataExchangeClient je instance svázaná s jednou ChannelFactoryBase instancí. Instanci používanou System.ServiceModel.Description.MetadataExchangeClient přepsáním GetChannelFactory virtuální metody můžete změnit nebo nahraditChannelFactoryBase. Podobně můžete změnit nebo nahradit System.Net.HttpWebRequest instanci používanou System.ServiceModel.Description.MetadataExchangeClient k provedení požadavků HTTP/GET přepsáním MetadataExchangeClient.GetWebRequest virtuální metody.
Metadata služby můžete načíst pomocí požadavků WS-MetadataExchange nebo HTTP/GET pomocí nástroje Svcutil.exe a předáním přepínače /target:metadata a adresy. Svcutil.exe stáhne metadata na zadanou adresu a uloží soubory na disk. Svcutil.exe interně používá System.ServiceModel.Description.MetadataExchangeClient instanci a načte konfiguraci koncového bodu MEX (ze konfiguračního souboru aplikace), jejíž název odpovídá schématu adresy předané Svcutil.exe, pokud existuje. V opačném případě Svcutil.exe použít jednu z vazeb definovaných statickým typem MetadataExchangeBindings továrny.
Import metadat služby
V WCF je import metadat procesem generování abstraktní reprezentace služby nebo jejích součástí z metadat. WCF může například importovat ServiceEndpoint instance, Binding instance nebo ContractDescription instance z dokumentu WSDL pro službu. Chcete-li importovat metadata služby ve WCF, použijte implementaci MetadataImporter abstraktní třídy. Typy odvozené z System.ServiceModel.Description.MetadataImporter třídy implementují podporu pro import formátů metadat, které využívají logiku importu WS-Policy ve WCF.
Implementace System.ServiceModel.Description.MetadataImporter shromažďuje výrazy zásad připojené k metadatům služby v objektu PolicyConversionContext . Potom System.ServiceModel.Description.MetadataImporter zpracuje zásady jako součást importu metadat voláním implementací IPolicyImportExtension rozhraní ve PolicyImportExtensions vlastnosti.
Podporu importu nových kontrolních výrazů zásad do objektu System.ServiceModel.Description.MetadataImporter můžete přidat přidáním vlastní implementace IPolicyImportExtension rozhraní do PolicyImportExtensions kolekce v System.ServiceModel.Description.MetadataImporter instanci. Případně můžete rozšíření importu zásad zaregistrovat v konfiguračním souboru klientské aplikace.
Typ System.ServiceModel.Description.WsdlImporter je implementace System.ServiceModel.Description.MetadataImporter abstraktní třídy, která je součástí WCF. Typ System.ServiceModel.Description.WsdlImporter importuje metadata WSDL s připojenými zásadami, které jsou součástí objektu MetadataSet .
Podporu importu rozšíření WSDL můžete přidat implementací IWsdlImportExtension rozhraní a následným přidáním implementace do WsdlImportExtensions vlastnosti ve vaší System.ServiceModel.Description.WsdlImporter instanci. Může System.ServiceModel.Description.WsdlImporter také načíst implementace rozhraní registrovaného v konfiguračním System.ServiceModel.Description.IWsdlImportExtension souboru klientské aplikace.
Dynamické vazby
Vazbu, kterou používáte k vytvoření kanálu, můžete dynamicky aktualizovat na koncový bod služby v případě, že se vazba koncového bodu změní, nebo chcete vytvořit kanál do koncového bodu, který používá stejný kontrakt, ale má jinou vazbu. Statickou třídu můžete použít MetadataResolver k načtení a importu metadat za běhu pro koncové body služby, které implementují konkrétní kontrakt. Importované System.ServiceModel.Description.ServiceEndpoint objekty pak můžete použít k vytvoření objektu pro vytváření klienta nebo kanálu do požadovaného koncového bodu.