Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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, jako je 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 pro výměnu 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 viz 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.
Exportování metadata 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 rámec pro generování výrazů zásad, které popisují schopnosti a požadavky vazby koncového bodu a s nimi související operace, zprávy a chyby. Tyto výrazy zásad jsou zaznamenány v instanci PolicyConversionContext. Implementace System.ServiceModel.Description.MetadataExporter pak může tyto výrazy zásad připojit k metadatům, která generuje.
Volání pomocí System.ServiceModel.Description.MetadataExporter každého System.ServiceModel.Channels.BindingElement, který implementuje rozhraní IPolicyExportExtension v rámci vazby ServiceEndpoint se vytváří objekt PolicyConversionContext pro použití v implementaci System.ServiceModel.Description.MetadataExporter. Nové zásady prohlášení můžete exportovat implementací rozhraní IPolicyExportExtension ve vašich vlastních implementacích typu BindingElement.
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í WSDL metadata nebo rozšíření WSDL pro chování koncových bodů, chování kontraktů nebo prvky vazeb v koncovém bodu služby, můžete implementovat rozhraní IWsdlExportExtension. WsdlExporter zkoumá ServiceEndpoint instanci kvůli vazebním prvkům, 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. Publikování metadat služby zpřístupňuje metadata pomocí standardizovaných protokolů, jako jsou MEX a HTTP/GET požadavky. 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 služby WCF, musíte nejprve do této 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í chování služby System.ServiceModel.Description.ServiceMetadataBehavior můžete zveřejnit koncové body metadat, které podporují protokol MEX nebo 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 s kontraktem s názvem IMetadataExchange. WCF definuje rozhraní IMetadataExchange s tímto názvem kontraktu služby. Koncové body WS-MetadataExchange nebo MEX mohou použít jednu ze čtyř výchozích vazeb, které jsou vystaveny statickými metodami továrny třídy MetadataExchangeBindings, aby se zarovnaly s výchozími vazbami používanými nástroji WCF, jako je Svcutil.exe. Koncové body metadat MEX můžete také nakonfigurovat pomocí vlastní vazby.
Tato ServiceMetadataBehavior používá System.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.
ServiceMetadataBehavior rozšiřuje vašeho hostitele služby přidáním ServiceMetadataExtension instance jako rozšíření. System.ServiceModel.Description.ServiceMetadataExtension poskytuje implementaci protokolů pro publikaci metadat. K získání metadat služby za běhu můžete použít System.ServiceModel.Description.ServiceMetadataExtension, abyste získali přístup k vlastnosti Metadata.
Upozornění
Pokud do konfiguračního souboru aplikace přidáte koncový bod MEX a poté se pokusíte přidat ServiceMetadataBehavior do 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 do konfiguračního souboru přidáte ServiceMetadataBehavior nebo že do kódu přidáte jak koncový bod, tak ServiceMetadataBehavior.
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 Self-Host.
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 jsou 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í je instance System.ServiceModel.Description.MetadataExchangeClient spojena s jednou instancí ChannelFactoryBase. Můžete změnit nebo nahradit ChannelFactoryBase instance používané System.ServiceModel.Description.MetadataExchangeClient tím, že přepíšete GetChannelFactory virtuální metodu. Podobně můžete změnit nebo nahradit instanci System.Net.HttpWebRequest používanou System.ServiceModel.Description.MetadataExchangeClient pro odesílání požadavků HTTP/GET přepsáním virtuální metody MetadataExchangeClient.GetWebRequest.
Metadata služby můžete načíst pomocí WS-MetadataExchange nebo požadavků HTTP/GET použitím nástroje Svcutil.exe, přepnutím /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 (z konfiguračního souboru aplikace), jehož název odpovídá schématu adresy předané Svcutil.exe, pokud existuje. V opačném případě Svcutil.exe přechází na použití jedné z vazeb definovaných statickým typem továrny MetadataExchangeBindings.
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 importu formátů metadat, které využívají WS-Policy logiku importu 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.
Do objektu System.ServiceModel.Description.MetadataImporter můžete přidat podporu pro import nových kontrolních výrazů zásad tím, že přidáte vlastní implementaci rozhraní IPolicyImportExtension do kolekce PolicyImportExtensions na instanci System.ServiceModel.Description.MetadataImporter. 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. System.ServiceModel.Description.WsdlImporter může také načíst implementace rozhraní registrovaných v konfiguračním souboru vaší 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í továrny klienta nebo kanálu pro požadovaný koncový bod.
Viz také
- System.ServiceModel.Description
- Formáty metadat
- Exportování a importování metadat
- Metadata publikování
- Načítání metadat
- používání metadat
- Aspekty zabezpečení s využitím metadat
- Rozšíření systému metadat