Przegląd architektury metadanych
Program Windows Communication Foundation (WCF) udostępnia zaawansowaną infrastrukturę do eksportowania, publikowania, pobierania i importowania metadanych usługi. Usługi WCF używają metadanych do opisania sposobu interakcji z punktami końcowymi usługi, dzięki czemu narzędzia, takie jak Svcutil.exe, mogą automatycznie generować kod klienta na potrzeby uzyskiwania dostępu do usługi.
Większość typów tworzących infrastrukturę metadanych WCF znajduje się w System.ServiceModel.Description przestrzeni nazw.
Program WCF używa ServiceEndpoint klasy do opisywania punktów końcowych w usłudze. Za pomocą programu WCF można wygenerować metadane dla punktów końcowych usługi lub zaimportować metadane usługi w celu wygenerowania ServiceEndpoint wystąpień.
Program WCF reprezentuje metadane usługi jako wystąpienie MetadataSet typu, której struktura jest silnie powiązana z formatem serializacji metadanych zdefiniowanym w programie WS-MetadataExchange. Typ MetadataSet łączy rzeczywiste metadane usługi, takie jak dokumenty języka WSDL (Web Services Description Language), dokumenty schematu XML lub wyrażenia WS-Policy jako kolekcja MetadataSection wystąpień. Każde System.ServiceModel.Description.MetadataSection wystąpienie zawiera określony dialekt metadanych i identyfikator. Obiekt System.ServiceModel.Description.MetadataSection może zawierać następujące elementy we właściwości MetadataSection.Metadata :
Nieprzetworzone metadane.
MetadataReference Wystąpienie.
MetadataLocation Wystąpienie.
System.ServiceModel.Description.MetadataReference Wystąpienia wskazują inny punkt końcowy wymiany metadanych (MEX) i System.ServiceModel.Description.MetadataLocation wystąpienia wskazują dokument metadanych przy użyciu adresu URL PROTOKOŁU HTTP. Program WCF obsługuje używanie dokumentów WSDL do opisywania punktów końcowych usługi, kontraktów usług, powiązań, wzorców wymiany komunikatów, komunikatów i komunikatów o błędach implementowanych przez usługę. Typy danych używane przez usługę są opisane w dokumentach WSDL przy użyciu schematu XML. Aby uzyskać więcej informacji, zobacz Importowanie i eksportowanie schematu. Za pomocą programu WCF można eksportować i importować rozszerzenia WSDL na potrzeby zachowania usługi, zachowania kontraktu i elementów powiązania, które rozszerzają funkcjonalność usługi. Aby uzyskać więcej informacji, zobacz Eksportowanie niestandardowych metadanych dla rozszerzenia WCF.
Eksportowanie metadanych usługi
W programie WCF eksportowanie metadanych to proces opisywania punktów końcowych usługi i projekcji ich w równoległą, ustandaryzowaną reprezentację, która umożliwia klientom zrozumienie sposobu korzystania z usługi. Aby wyeksportować metadane z ServiceEndpoint wystąpień, użyj implementacji klasy abstrakcyjnej MetadataExporter . Implementacja System.ServiceModel.Description.MetadataExporter generuje metadane hermetyzowane w wystąpieniu MetadataSet .
Klasa System.ServiceModel.Description.MetadataExporter udostępnia platformę do generowania wyrażeń zasad opisujących możliwości i wymagania powiązania punktu końcowego oraz skojarzonych operacji, komunikatów i błędów. Te wyrażenia zasad są przechwytywane w wystąpieniu PolicyConversionContext . Implementacja System.ServiceModel.Description.MetadataExporter może następnie dołączyć te wyrażenia zasad do wygenerowanych metadanych.
Wywołania System.ServiceModel.Description.MetadataExporter do każdego System.ServiceModel.Channels.BindingElement , który implementuje IPolicyExportExtension interfejs w powiązaniu ServiceEndpoint obiektu podczas generowania PolicyConversionContext obiektu do użycia przez implementację System.ServiceModel.Description.MetadataExporter . Nowe asercji zasad można wyeksportować, implementując IPolicyExportExtension interfejs w niestandardowych implementacjach BindingElement typu.
Typ WsdlExporter jest implementacją klasy abstrakcyjnej dołączonej System.ServiceModel.Description.MetadataExporter do programu WCF. Typ WsdlExporter generuje metadane WSDL z dołączonymi wyrażeniami zasad.
Aby wyeksportować niestandardowe metadane WSDL lub rozszerzenia WSDL dla zachowań punktu końcowego, zachowania kontraktu lub elementów powiązania w punkcie końcowym usługi, możesz zaimplementować IWsdlExportExtension interfejs. Narzędzie WsdlExporter analizuje ServiceEndpoint wystąpienie elementów powiązania, zachowania operacji, zachowania kontraktu i zachowania punktów końcowych, które implementują IWsdlExportExtension interfejs podczas generowania dokumentu WSDL.
Publikowanie metadanych usługi
Usługi WCF publikują metadane przez uwidacznianie co najmniej jednego punktu końcowego metadanych. Publikowanie metadanych usługi udostępnia metadane usługi przy użyciu standardowych protokołów, takich jak żądania MEX i HTTP/GET. Punkty końcowe metadanych są podobne do innych punktów końcowych usługi, w których mają adres, powiązanie i kontrakt. Punkty końcowe metadanych można dodać do hosta usługi w konfiguracji lub w kodzie.
Aby opublikować punkty końcowe metadanych dla usługi WCF, należy najpierw dodać wystąpienie ServiceMetadataBehavior zachowania usługi do usługi. Dodanie wystąpienia do usługi rozszerza usługę System.ServiceModel.Description.ServiceMetadataBehavior o możliwość publikowania metadanych przez uwidacznianie co najmniej jednego punktu końcowego metadanych. Po dodaniu System.ServiceModel.Description.ServiceMetadataBehavior zachowania usługi można uwidocznić punkty końcowe metadanych, które obsługują protokół MEX lub punkty końcowe metadanych, które odpowiadają na żądania HTTP/GET.
Aby dodać punkty końcowe metadanych używające protokołu MEX, dodaj punkty końcowe usługi do hosta usługi korzystającego z kontraktu usługi o nazwie IMetadataExchange.WCF definiuje IMetadataExchange interfejs, który ma tę nazwę kontraktu usługi. Punkty końcowe WS-MetadataExchange lub punkty końcowe MEX mogą używać jednego z czterech domyślnych powiązań uwidocznionych przez metody fabryki statycznej w MetadataExchangeBindings klasie, aby dopasować domyślne powiązania używane przez narzędzia WCF, takie jak Svcutil.exe. Punkty końcowe metadanych MEX można również skonfigurować przy użyciu powiązania niestandardowego.
Element używa elementu do System.ServiceModel.Description.WsdlExporter eksportowania ServiceMetadataBehavior metadanych dla wszystkich punktów końcowych usługi w usłudze. Aby uzyskać więcej informacji na temat eksportowania metadanych z usługi, zobacz Eksportowanie i importowanie metadanych.
Rozszerzenie ServiceMetadataBehavior hosta usługi przez dodanie ServiceMetadataExtension wystąpienia jako rozszerzenia do hosta usługi. Element System.ServiceModel.Description.ServiceMetadataExtension udostępnia implementację protokołów publikowania metadanych. Możesz również użyć elementu System.ServiceModel.Description.ServiceMetadataExtension , aby pobrać metadane usługi w czasie wykonywania, korzystając Metadata z właściwości .
Uwaga
Jeśli dodasz punkt końcowy MEX w pliku konfiguracji aplikacji, a następnie spróbujesz dodać ServiceMetadataBehavior element do hosta usługi w kodzie, otrzymasz następujący wyjątek:
System.InvalidOperationException: nie można odnaleźć nazwy kontraktu "IMetadataExchange" na liście kontraktów implementowanych przez usługę Service1. Dodaj element ServiceMetadataBehavior do pliku konfiguracji lub do hosta ServiceHost bezpośrednio, aby włączyć obsługę tego kontraktu.
Ten problem można obejść, dodając element ServiceMetadataBehavior w pliku konfiguracji lub dodając zarówno punkt końcowy, jak i ServiceMetadataBehavior w kodzie.
Aby zapoznać się z przykładem dodawania ServiceMetadataBehavior pliku konfiguracji aplikacji, zobacz Wprowadzenie. Przykład dodawania ServiceMetadataBehavior kodu można znaleźć w przykładzie self-host .
Uwaga
Podczas publikowania metadanych dla usługi, która uwidacznia dwa różne kontrakty usług, w których każda zawiera operację o tej samej nazwie, zgłaszany jest wyjątek. Jeśli na przykład masz usługę, która uwidacznia kontrakt usługi o nazwie ICarService, która ma operację Get(Car c) i ta sama usługa uwidacznia kontrakt usługi o nazwie IBookService, który ma operację Get(Book b), podczas generowania metadanych usługi jest wyświetlany wyjątek lub jest wyświetlany komunikat o błędzie. Aby obejść ten problem, wykonaj jedną z następujących czynności:
Pobieranie metadanych usługi
Program WCF może pobierać metadane usługi przy użyciu standardowych protokołów, takich jak WS-MetadataExchange i HTTP. Oba te protokoły są obsługiwane przez MetadataExchangeClient typ. Metadane usługi są pobierane przy użyciu System.ServiceModel.Description.MetadataExchangeClient typu, podając adres i opcjonalne powiązanie. Powiązanie używane przez System.ServiceModel.Description.MetadataExchangeClient wystąpienie może być jednym z domyślnych powiązań z MetadataExchangeBindings klasy statycznej, powiązania dostarczonego przez użytkownika lub powiązania załadowanego z konfiguracji punktu końcowego dla kontraktu IMetadataExchange
. Można System.ServiceModel.Description.MetadataExchangeClient również rozpoznać odwołania adresu URL HTTP do metadanych przy użyciu HttpWebRequest typu .
Domyślnie System.ServiceModel.Description.MetadataExchangeClient wystąpienie jest powiązane z pojedynczym ChannelFactoryBase wystąpieniem. Możesz zmienić lub zastąpić ChannelFactoryBase wystąpienie używane przez System.ServiceModel.Description.MetadataExchangeClient metodę wirtualną GetChannelFactory . Podobnie można zmienić lub zastąpić System.Net.HttpWebRequest wystąpienie używane przez System.ServiceModel.Description.MetadataExchangeClient element , aby wysyłać żądania HTTP/GET, zastępując metodę wirtualną MetadataExchangeClient.GetWebRequest .
Metadane usługi można pobierać przy użyciu żądań WS-MetadataExchange lub HTTP/GET przy użyciu narzędzia Svcutil.exe i przekazywania przełącznika /target:metadata i adresu. Svcutil.exe pobiera metadane pod określonym adresem i zapisuje pliki na dysku. Svcutil.exe używa wystąpienia wewnętrznie i ładuje konfigurację punktu końcowego System.ServiceModel.Description.MetadataExchangeClient MEX (z pliku konfiguracji aplikacji), którego nazwa odpowiada schematowi adresu przekazanego do Svcutil.exe, jeśli istnieje. W przeciwnym razie Svcutil.exe domyślnie używać jednego z powiązań zdefiniowanych przez typ fabryki statycznej MetadataExchangeBindings .
Importowanie metadanych usługi
W programie WCF importowanie metadanych to proces generowania abstrakcyjnej reprezentacji usługi lub jej składników na podstawie metadanych. Na przykład program WCF może importować ServiceEndpoint wystąpienia, Binding wystąpienia lub ContractDescription wystąpienia z dokumentu WSDL dla usługi. Aby zaimportować metadane usługi w programie WCF, użyj implementacji klasy abstrakcyjnej MetadataImporter . Typy pochodzące z System.ServiceModel.Description.MetadataImporter klasy implementują obsługę importowania formatów metadanych korzystających z logiki importu WS-Policy w programie WCF.
Implementacja System.ServiceModel.Description.MetadataImporter zbiera wyrażenia zasad dołączone do metadanych usługi w PolicyConversionContext obiekcie. Następnie System.ServiceModel.Description.MetadataImporter przetwarza zasady w ramach importowania metadanych przez wywołanie implementacji interfejsu IPolicyImportExtensionPolicyImportExtensions we właściwości .
Możesz dodać obsługę importowania nowych asercji zasad do klasy System.ServiceModel.Description.MetadataImporter , dodając własną implementację interfejsu IPolicyImportExtensionPolicyImportExtensions do kolekcji w wystąpieniu System.ServiceModel.Description.MetadataImporter . Alternatywnie możesz zarejestrować rozszerzenie importu zasad w pliku konfiguracji aplikacji klienckiej.
Typ System.ServiceModel.Description.WsdlImporter jest implementacją klasy abstrakcyjnej dołączonej System.ServiceModel.Description.MetadataImporter do programu WCF. System.ServiceModel.Description.WsdlImporter Typ importuje metadane WSDL z dołączonymi zasadami, które są powiązane w MetadataSet obiekcie.
Obsługę importowania rozszerzeń WSDL można dodać, implementując IWsdlImportExtension interfejs, a następnie dodając implementację do właściwości w wystąpieniu WsdlImportExtensionsSystem.ServiceModel.Description.WsdlImporter . Element System.ServiceModel.Description.WsdlImporter może również załadować implementacje interfejsu zarejestrowanego System.ServiceModel.Description.IWsdlImportExtension w pliku konfiguracji aplikacji klienckiej.
Powiązania dynamiczne
Można dynamicznie aktualizować powiązanie używane do tworzenia kanału do punktu końcowego usługi w przypadku zmiany powiązania punktu końcowego lub utworzenia kanału do punktu końcowego, który używa tego samego kontraktu, ale ma inne powiązanie. Klasę statyczną można użyć do pobierania MetadataResolver i importowania metadanych w czasie wykonywania dla punktów końcowych usługi, które implementują określony kontrakt. Następnie możesz użyć zaimportowanych System.ServiceModel.Description.ServiceEndpoint obiektów, aby utworzyć fabrykę klienta lub kanału w żądanym punkcie końcowym.