Przegląd architektury metadanych

Windows Program Communication Foundation (WCF) zapewnia bogatą infrastrukturę do eksportowania, publikowania, pobierania i importowania metadanych usługi. Usługi WCF używają metadanych do opisywania sposobu interakcji z punktami końcowymi usługi, dzięki czemu narzędzia, takie jak Svcutil.exe, mogą automatycznie generować kod klienta w celu uzyskania dostępu do usługi.

Większość typów, które składa się na infrastrukturę metadanych programu WCF, znajduje się w przestrzeni System.ServiceModel.Description nazw .

Usługa WCF używa ServiceEndpoint klasy do opisywania punktów końcowych w usłudze. Za pomocą usługi WCF można generować metadane dla punktów końcowych usługi lub importować metadane usługi w celu ServiceEndpoint generowania wystąpień.

Usługa WCF reprezentuje metadane dla usługi jako wystąpienie typu, którego struktura jest silnie powiązana z formatem serializacji metadanych zdefiniowanym w pliku MetadataSet WS-MetadataExchange. Typ zawiera rzeczywiste metadane usługi, takie jak dokumenty Web Services Description Language (WSDL), dokumenty schematu XML lub wyrażenia WS-Policy, jako kolekcję MetadataSet MetadataSection wystąpień. Każde System.ServiceModel.Description.MetadataSection wystąpienie zawiera określony dialekt metadanych i identyfikator. Element System.ServiceModel.Description.MetadataSection może zawierać następujące elementy we właściwości MetadataSection.Metadata :

Wystąpienia wskazują inny punkt końcowy wymiany metadanych (MEX), a wystąpienia wskazują dokument System.ServiceModel.Description.MetadataReference System.ServiceModel.Description.MetadataLocation metadanych przy użyciu adresu URL HTTP. Usługa 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 zaimplementowanych 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 dla zachowania usługi, zachowania kontraktu i elementów powiązania, które rozszerzają funkcjonalność usługi. Aby uzyskać więcej informacji, zobacz Exporting Custom Metadata for a WCF Extension (Eksportowanieniestandardowych metadanych dla rozszerzenia programu WCF).

Eksportowanie metadanych usługi

W programie WCF eksportowanie metadanych jest procesem opisywania punktów końcowych usługi i rzutowania ich na równoległą, standaryzowaną reprezentację, przy użyciu których klienci mogą zrozumieć sposób korzystania z usługi. Aby wyeksportować ServiceEndpoint metadane z wystąpień, użyj implementacji klasy MetadataExporter abstrakcyjnej. Implementacja System.ServiceModel.Description.MetadataExporter generuje metadane, które są hermetyzowane w MetadataSet wystąpieniu.

Klasa udostępnia platformę do generowania wyrażeń zasad, które opisują możliwości i wymagania powiązania punktu końcowego oraz skojarzone z nim operacje, komunikaty System.ServiceModel.Description.MetadataExporter i błędy. Te wyrażenia zasad są przechwytywane w PolicyConversionContext wystąpieniu. 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 System.ServiceModel.Channels.BindingElement każdego, który implementuje interfejs w powiązaniu obiektu podczas generowania obiektu do użycia przez IPolicyExportExtension ServiceEndpoint PolicyConversionContext System.ServiceModel.Description.MetadataExporter implementację. Nowe asercji zasad można wyeksportować, implementując IPolicyExportExtension interfejs w niestandardowych implementacjach BindingElement typu.

Typ WsdlExporter jest implementacją klasy System.ServiceModel.Description.MetadataExporter abstrakcyjnej dołączonej do usługi 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żna zaimplementować IWsdlExportExtension interfejs. Element wyszukuje wystąpienie elementów powiązania, zachowania operacji, zachowania kontraktu i zachowania punktu końcowego, które implementują interfejs podczas generowania WsdlExporter ServiceEndpoint dokumentu IWsdlExportExtension WSDL.

Publikowanie metadanych usługi

Usługi WCF publikują metadane, ujawniając co najmniej jeden punkt końcowy metadanych. Metadane usługi publikowania sprawiają, że metadane usługi są dostępne 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, ponieważ 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ć do usługi wystąpienie ServiceMetadataBehavior zachowania usługi. Dodanie wystąpienia do usługi rozszerza możliwości publikowania metadanych przez udostępnianie co najmniej jednego punktu System.ServiceModel.Description.ServiceMetadataBehavior końcowego metadanych. Po dodaniu zachowania usługi można uwidocznić punkty końcowe metadanych, które obsługują protokół MEX lub punkty końcowe metadanych, które odpowiadają System.ServiceModel.Description.ServiceMetadataBehavior na żądania HTTP/GET.

Aby dodać punkty końcowe metadanych, które korzystają z protokołu MEX, dodaj punkty końcowe usługi do hosta usługi, który używa kontraktu usługi o nazwie IMetadataExchange.WCF, definiuje interfejs, który ma tę nazwę kontraktu IMetadataExchange usługi. WS-MetadataExchange końcowe (punkty końcowe MEX) mogą używać jednego z czterech domyślnych powiązań ujawnionych przez metody statycznej fabryki w klasie w celu dopasowania domyślnych powiązań używanych przez narzędzia WCF, takie jak MetadataExchangeBindings Svcutil.exe. Punkty końcowe metadanych MEX można również skonfigurować przy użyciu powiązania niestandardowego.

Używa ServiceMetadataBehavior obiektu do System.ServiceModel.Description.WsdlExporter eksportowania 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 Exporting and Importing Metadata (Eksportowanie i importowanie metadanych).

Rozszerzenie ServiceMetadataBehavior rozszerza hosta usługi, dodając wystąpienie jako rozszerzenie ServiceMetadataExtension do hosta usługi. Zapewnia System.ServiceModel.Description.ServiceMetadataExtension implementację protokołów publikowania metadanych. Możesz również użyć obiektu , aby pobrać metadane usługi w czasie System.ServiceModel.Description.ServiceMetadataExtension uruchamiania, korzystając z właściwości Metadata .

Przestroga

Jeśli dodasz punkt końcowy MEX w pliku konfiguracji aplikacji, a następnie spróbujemy dodać parametr do hosta usługi w kodzie, ServiceMetadataBehavior wystąpi następujący wyjątek:

System.InvalidOperationException: Nie można znaleźć nazwy kontraktu "IMetadataExchange" na liście kontraktów zaimplementowanych przez usługę Service1. Dodaj serviceMetadataBehavior do pliku konfiguracji lub do hosta usługi bezpośrednio, aby włączyć obsługę tego kontraktu.

Ten problem można omiń, dodając plik w pliku konfiguracji lub dodając punkt ServiceMetadataBehavior końcowy i ServiceMetadataBehavior kod.

Przykład dodawania w pliku konfiguracji aplikacji można znaleźć ServiceMetadataBehavior w Wprowadzenie. Przykład dodawania kodu ServiceMetadataBehavior można znaleźć w przykładzie Samodzielne hosty.

Przestroga

Podczas publikowania metadanych dla usługi, która uwidacznia dwa różne kontrakty usług, w których każdy zawiera operację o tej samej nazwie, zgłaszany jest wyjątek. Jeśli na przykład masz usługę, która uwidacznia umowę usługi o nazwie ICarService, która ma operację Get(Car c), a ta sama usługa uwidacznia umowę usługi o nazwie IBookService, która ma operację Get(Book b), zgłaszany jest wyjątek lub podczas generowania metadanych usługi jest wyświetlany komunikat o błędzie. Aby omiń ten problem, wykonaj jedną z następujących czynności:

  • Zmień nazwę jednej z operacji.
  • Ustaw Name wartość na inną nazwę.
  • Ustaw jedną z przestrzeni nazw operacji na inną przestrzeń nazw przy użyciu Namespace właściwości .

Pobieranie metadanych usługi

Usługa 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 pobiera się przy System.ServiceModel.Description.MetadataExchangeClient użyciu typu , podając adres i opcjonalne powiązanie. Powiązanie używane przez wystąpienie może być jednym z domyślnych powiązań z klasy statycznej, powiązania dostarczonego przez użytkownika lub powiązania załadowanego z konfiguracji punktu końcowego System.ServiceModel.Description.MetadataExchangeClient MetadataExchangeBindings dla IMetadataExchange kontraktu. Może System.ServiceModel.Description.MetadataExchangeClient również rozstrzygić odwołania adresu URL HTTP do metadanych przy użyciu HttpWebRequest typu .

Domyślnie wystąpienie System.ServiceModel.Description.MetadataExchangeClient jest powiązane z pojedynczym ChannelFactoryBase wystąpieniem. Możesz zmienić lub zastąpić wystąpienie ChannelFactoryBase używane przez metodę przez zastąpienie metody System.ServiceModel.Description.MetadataExchangeClient GetChannelFactory wirtualnej. Podobnie można zmienić lub zastąpić wystąpienie używane przez metodę do żądania System.Net.HttpWebRequest System.ServiceModel.Description.MetadataExchangeClient HTTP/GET przez zastąpienie metody MetadataExchangeClient.GetWebRequest wirtualnej.

Metadane usługi można pobrać przy użyciu żądań WS-MetadataExchange lub HTTP/GET za pomocą narzędzia Svcutil.exe i przekazując przełącznik /target:metadata oraz adres. 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 MEX (z pliku konfiguracji aplikacji), której nazwa jest taka sama jak schemat adresu przekazanego do Svcutil.exe, jeśli System.ServiceModel.Description.MetadataExchangeClient taka istnieje. W przeciwnym Svcutil.exe domyślnie używać jednego z powiązań zdefiniowanych przez typ MetadataExchangeBindings fabryki statycznej.

Importowanie metadanych usługi

W programie WCF importowanie metadanych jest procesem generowania abstrakcyjnej reprezentacji usługi lub jej części składowych z jej metadanych. Na przykład usługa WCF może importować wystąpienia, wystąpienia lub wystąpienia z ServiceEndpoint Binding dokumentu ContractDescription WSDL dla usługi. Aby zaimportować metadane usługi w programie WCF, użyj implementacji klasy MetadataImporter abstrakcyjnej. Typy pochodzące z klasy implementują obsługę importowania formatów metadanych, które WS-Policy System.ServiceModel.Description.MetadataImporter logiki importowania w programie WCF.

Implementacja System.ServiceModel.Description.MetadataImporter zbiera wyrażenia zasad dołączone do metadanych usługi w PolicyConversionContext obiekcie . Następnie przetwarza zasady w ramach importowania metadanych przez wywołanie System.ServiceModel.Description.MetadataImporter implementacji IPolicyImportExtension interfejsu we właściwości PolicyImportExtensions .

Obsługę importowania nowych asercji zasad można dodać do obiektu , dodając własną implementację interfejsu System.ServiceModel.Description.MetadataImporter IPolicyImportExtension do PolicyImportExtensions kolekcji w System.ServiceModel.Description.MetadataImporter wystąpieniu. Alternatywnie możesz zarejestrować rozszerzenie importu zasad w pliku konfiguracji aplikacji klienckiej.

Typ System.ServiceModel.Description.WsdlImporter jest implementacją klasy System.ServiceModel.Description.MetadataImporter abstrakcyjnej dołączonej do usługi WCF. Typ System.ServiceModel.Description.WsdlImporter 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 interfejs, a następnie dodając implementację do IWsdlImportExtension WsdlImportExtensions właściwości w System.ServiceModel.Description.WsdlImporter wystąpieniu. Może System.ServiceModel.Description.WsdlImporter również ładować implementacje System.ServiceModel.Description.IWsdlImportExtension interfejsu zarejestrowanego w pliku konfiguracji aplikacji klienckiej.

Powiązania dynamiczne

Możesz dynamicznie zaktualizować powiązanie, którego używasz do utworzenia kanału do punktu końcowego usługi w przypadku zmiany powiązania dla punktu końcowego lub chcesz utworzyć kanał do punktu końcowego, który używa tego samego kontraktu, ale ma inne powiązanie. Za pomocą klasy statycznej można pobierać i importować metadane w czasie działania dla punktów końcowych MetadataResolver usługi, które implementują określony kontrakt. Następnie można użyć zaimportowanych obiektów do utworzenia klienta lub fabryki System.ServiceModel.Description.ServiceEndpoint kanału do żądanego punktu końcowego.

Zobacz też