다음을 통해 공유


메타데이터 아키텍처 개요

WCF(Windows Communication Foundation)는 서비스 메타데이터 내보내기, 게시, 검색 및 가져오기를 위한 풍부한 인프라를 제공합니다. WCF 서비스는 메타데이터를 사용하여 Svcutil.exe같은 도구가 서비스에 액세스하기 위한 클라이언트 코드를 자동으로 생성할 수 있도록 서비스의 엔드포인트와 상호 작용하는 방법을 설명합니다.

WCF 메타데이터 인프라를 구성하는 대부분의 형식은 네임스페이스에 System.ServiceModel.Description 상주합니다.

WCF는 클래스를 ServiceEndpoint 사용하여 서비스의 엔드포인트를 설명합니다. WCF를 사용하여 서비스 엔드포인트에 대한 메타데이터를 생성하거나 서비스 메타데이터를 가져와 인스턴스를 생성 ServiceEndpoint 할 수 있습니다.

WCF는 서비스의 메타데이터를 형식의 MetadataSet 인스턴스로 나타내며, 이 형식의 구조는 WS-MetadataExchange에 정의된 메타데이터 serialization 형식에 강력하게 연결됩니다. 이 형식은 MetadataSet WSDL(Web Services Description Language) 문서, XML 스키마 문서 또는 WS-Policy 식과 같은 실제 서비스 메타데이터를 인스턴스 컬렉션 MetadataSection 으로 번들로 묶습니다. 각 System.ServiceModel.Description.MetadataSection 인스턴스에는 특정 메타데이터 방언과 식별자가 포함됩니다. A System.ServiceModel.Description.MetadataSectionMetadataSection.Metadata 특성에 다음 항목을 포함할 수 있습니다.

System.ServiceModel.Description.MetadataReference 인스턴스는 다른 MEX(메타데이터 교환) 엔드포인트를 가리키고 System.ServiceModel.Description.MetadataLocation 인스턴스는 HTTP URL을 사용하여 메타데이터 문서를 가리킵니다. WCF는 WSDL 문서를 사용하여 서비스 엔드포인트, 서비스 계약, 바인딩, 메시지 교환 패턴, 메시지 및 서비스에서 구현한 오류 메시지를 설명할 수 있도록 지원합니다. 서비스에서 사용하는 데이터 형식은 XML 스키마를 사용하는 WSDL 문서에 설명되어 있습니다. 자세한 내용은 스키마 가져오기 및 내보내기 참조하세요. WCF를 사용하여 서비스 동작, 계약 동작 및 서비스의 기능을 확장하는 바인딩 요소에 대한 WSDL 확장을 내보내고 가져올 수 있습니다. 자세한 내용은 WCF 확장에 대한 사용자 지정 메타데이터 내보내기를 참조하세요.

서비스 메타데이터 내보내기

WCF에서 메타데이터 내보내 기는 서비스 엔드포인트를 설명하고 클라이언트가 서비스를 사용하는 방법을 이해하는 데 사용할 수 있는 병렬 표준화된 표현으로 프로젝팅하는 프로세스입니다. 인스턴스에서 ServiceEndpoint 메타데이터를 내보내려면 추상 클래스의 구현을 MetadataExporter 사용합니다. 구현은 메타데이터를 생성하고 이를 System.ServiceModel.Description.MetadataExporter 인스턴스에 캡슐화합니다.

이 클래스는 System.ServiceModel.Description.MetadataExporter 엔드포인트 바인딩의 기능 및 요구 사항 및 관련 작업, 메시지 및 오류를 설명하는 정책 식을 생성하기 위한 프레임워크를 제공합니다. 정책 표현은 PolicyConversionContext 인스턴스에서 포착됩니다. 구현체는 그 다음에 생성한 메타데이터에 이러한 정책 식을 연결할 수 있습니다.

System.ServiceModel.Description.MetadataExporterSystem.ServiceModel.Channels.BindingElement의 바인딩에서 IPolicyExportExtension 인터페이스를 구현하는 각 ServiceEndpoint에 호출하여 PolicyConversionContext 구현에 사용할 System.ServiceModel.Description.MetadataExporter 개체를 생성합니다. IPolicyExportExtension 인터페이스를 BindingElement 형식의 사용자 지정 구현에 적용하여 새 정책 어설션을 내보낼 수 있습니다.

WsdlExporter 형식은 WCF에 System.ServiceModel.Description.MetadataExporter 포함된 추상 클래스의 구현입니다. 이 WsdlExporter 형식은 첨부된 정책 표현식을 사용하여 WSDL 메타데이터를 생성합니다.

엔드포인트 동작, 계약 동작 또는 서비스 엔드포인트의 바인딩 요소에 대한 사용자 지정 WSDL 메타데이터 또는 WSDL 확장을 내보내려면 인터페이스를 IWsdlExportExtension 구현할 수 있습니다. WsdlExporter가 WSDL 문서를 생성할 때 인터페이스 ServiceEndpoint를 구현하는 IWsdlExportExtension 인스턴스에서 바인딩 요소, 작업 동작, 계약 동작, 및 엔드포인트 동작을 살펴봅니다.

게시 서비스 메타데이터

WCF 서비스는 하나 이상의 메타데이터 엔드포인트를 노출하여 메타데이터를 게시합니다. 서비스 메타데이터를 게시하면 MEX 및 HTTP/GET 요청과 같은 표준화된 프로토콜을 사용하여 서비스 메타데이터를 사용할 수 있습니다. 메타데이터 엔드포인트는 주소, 바인딩 및 계약이 있다는 점에서 다른 서비스 엔드포인트와 유사합니다. 구성 또는 코드에서 서비스 호스트에 메타데이터 엔드포인트를 추가할 수 있습니다.

WCF 서비스에 대한 메타데이터 엔드포인트를 게시하려면 먼저 서비스 동작의 인스턴스를 ServiceMetadataBehavior 서비스에 추가해야 합니다. 서비스에 인스턴스를 System.ServiceModel.Description.ServiceMetadataBehavior 추가하면 하나 이상의 메타데이터 엔드포인트를 노출하여 메타데이터를 게시하는 기능으로 서비스가 보강됩니다. 서비스 동작을 System.ServiceModel.Description.ServiceMetadataBehavior 추가한 후에는 HTTP/GET 요청에 응답하는 MEX 프로토콜 또는 메타데이터 엔드포인트를 지원하는 메타데이터 엔드포인트를 노출할 수 있습니다.

MEX 프로토콜을 사용하는 메타데이터 엔드포인트를 추가하려면 IMetadataExchange라는 서비스 계약을 사용하는 서비스 엔드포인트를 서비스 호스트에 추가합니다. WCF는 이 서비스 계약명을 가지는 IMetadataExchange 인터페이스를 정의합니다. WS-MetadataExchange 엔드포인트 또는 MEX 엔드포인트는 MetadataExchangeBindings 클래스의 정적 팩터리 메서드에서 제공하는 네 가지 기본 바인딩 중 하나를 사용하여 Svcutil.exe과 같은 WCF 도구에서 사용되는 기본 바인딩에 맞출 수 있습니다. 사용자 지정 바인딩을 사용하여 MEX 메타데이터 엔드포인트를 구성할 수도 있습니다.

ServiceMetadataBehavior는 서비스의 모든 서비스 엔드포인트에 대한 메타데이터를 내보내기 위해 System.ServiceModel.Description.WsdlExporter를 사용합니다. 서비스에서 메타데이터를 내보내는 방법에 대한 자세한 내용은 메타데이터 내보내기 및 가져오기를 참조하세요.

ServiceMetadataBehavior 서비스 호스트를 강화하기 위해 ServiceMetadataExtension 인스턴스를 서비스 호스트에 확장으로 추가합니다. 메타데이터 System.ServiceModel.Description.ServiceMetadataExtension 게시 프로토콜에 대한 구현을 제공합니다. System.ServiceModel.Description.ServiceMetadataExtension를 사용하여 런타임에 Metadata 속성에 액세스하여 서비스의 메타데이터를 가져올 수도 있습니다.

주의

애플리케이션 구성 파일에 MEX 엔드포인트를 추가한 다음, 코드에서 서비스 호스트에 ServiceMetadataBehavior를 추가하려고 하면 다음과 같은 예외가 발생하게 됩니다.

System.InvalidOperationException: Service1에서 구현한 계약 목록에서 계약 이름 'IMetadataExchange'를 찾을 수 없습니다. ServiceMetadataBehavior를 구성 파일 또는 ServiceHost에 직접 추가하여 이 계약에 대한 지원을 사용하도록 설정합니다.

이 문제를 해결하려면 구성 파일에 ServiceMetadataBehavior를 추가하거나 코드에 엔드포인트와 ServiceMetadataBehavior를 모두 추가하십시오.

애플리케이션 구성 파일에 추가하는 ServiceMetadataBehavior 예제는 시작하기를 참조 하세요. 코드에 추가하는 ServiceMetadataBehavior 예제는 자체 호스트 샘플을 참조하세요.

주의

두 개의 서로 다른 서비스 계약에서 동일한 이름의 작업을 포함하고 있는 경우, 이러한 계약을 노출하는 서비스의 메타데이터를 게시할 때 오류가 발생합니다. 예를 들어, ICarService라는 서비스 계약을 노출하고 Get(Car c) 작업이 있는 서비스가 있고, 동일한 서비스가 Get(Book b) 작업이 있는 IBookService라는 서비스 계약을 노출하는 경우, 서비스의 메타데이터를 생성할 때 예외가 발생하거나 오류 메시지가 표시됩니다. 이 문제를 해결하려면 다음 중 하나를 수행합니다.

  • 작업 중 하나의 이름을 바꿉니다.
  • Name 다른 이름으로 설정합니다.
  • 속성을 사용하여 작업의 네임스페이스 중 하나를 Namespace 다른 네임스페이스로 설정합니다.

서비스 메타데이터 검색

WCF는 WS-MetadataExchange 및 HTTP와 같은 표준화된 프로토콜을 사용하여 서비스 메타데이터를 검색할 수 있습니다. 이러한 프로토콜은 모두 형식에서 MetadataExchangeClient 지원됩니다. 주소와 선택적 바인딩을 제공함으로써 System.ServiceModel.Description.MetadataExchangeClient 타입을 사용하여 서비스 메타데이터를 가져옵니다. 인스턴스에서 System.ServiceModel.Description.MetadataExchangeClient 사용하는 바인딩은 정적 클래스의 기본 바인딩, 사용자가 제공한 바인딩 MetadataExchangeBindings 또는 계약에 대한 IMetadataExchange 엔드포인트 구성에서 로드된 바인딩 중 하나일 수 있습니다. 형식을 System.ServiceModel.Description.MetadataExchangeClient 사용하여 HttpWebRequest 메타데이터에 대한 HTTP URL 참조를 확인할 수도 있습니다.

기본적으로, System.ServiceModel.Description.MetadataExchangeClient 인스턴스는 단일 ChannelFactoryBase 인스턴스에 기본적으로 연결됩니다. ChannelFactoryBase 가상 메서드를 재정의하여 System.ServiceModel.Description.MetadataExchangeClient에서 사용되는 GetChannelFactory 인스턴스를 변경하거나 교체할 수 있습니다. 마찬가지로, System.Net.HttpWebRequest 가상 메서드를 재정의하여 HTTP/GET 요청을 만드는 데 사용되는 System.ServiceModel.Description.MetadataExchangeClient 인스턴스를 변경하거나 MetadataExchangeClient.GetWebRequest 인스턴스를 교체할 수 있습니다.

Svcutil.exe 도구를 사용하고 /target:metadata 스위치 및 주소를 전달하여 WS-MetadataExchange 또는 HTTP/GET 요청을 사용하여 서비스 메타데이터를 검색할 수 있습니다. Svcutil.exe 지정된 주소에서 메타데이터를 다운로드하고 파일을 디스크에 저장합니다. Svcutil.exe는 내부적으로 System.ServiceModel.Description.MetadataExchangeClient 인스턴스를 사용하고, 존재할 경우 Svcutil.exe에 전달된 주소의 체계와 이름이 일치하는 MEX 엔드포인트 구성을 애플리케이션 구성 파일에서 로드합니다. 그렇지 않으면 Svcutil.exe 기본적으로 정적 팩터리 형식으로 MetadataExchangeBindings 정의된 바인딩 중 하나를 사용합니다.

서비스 메타데이터 가져오기

WCF에서 메타데이터 가져오기는 메타데이터에서 서비스 또는 해당 구성 요소 파트의 추상 표현을 생성하는 프로세스입니다. 예를 들어 WCF는 서비스에 대한 WSDL 문서에서 ServiceEndpoint 인스턴스, Binding 인스턴스 또는 ContractDescription 인스턴스를 가져올 수 있습니다. WCF에서 서비스 메타데이터를 가져오려면 추상 클래스의 구현을 MetadataImporter 사용합니다. 클래스에서 파생되는 형식은 WCF에서 System.ServiceModel.Description.MetadataImporter WS-Policy 가져오기 논리를 활용하는 메타데이터 형식 가져오기 지원을 구현합니다.

구현은 System.ServiceModel.Description.MetadataImporter 개체의 서비스 메타데이터 PolicyConversionContext 에 연결된 정책 식을 수집합니다. 그런 System.ServiceModel.Description.MetadataImporterIPolicyImportExtension 속성에서 인터페이스 PolicyImportExtensions 의 구현을 호출하여 메타데이터 가져오기 일환으로 정책을 처리합니다.

자신의 System.ServiceModel.Description.MetadataImporter 인터페이스 구현을 IPolicyImportExtension 인스턴스의 PolicyImportExtensions 컬렉션에 추가하여 새로운 정책 어설션 System.ServiceModel.Description.MetadataImporter을 가져오기 위한 지원을 추가할 수 있습니다. 또는 클라이언트 애플리케이션 구성 파일에 정책 가져오기 확장을 등록할 수 있습니다.

System.ServiceModel.Description.WsdlImporter 형식은 WCF에 System.ServiceModel.Description.MetadataImporter 포함된 추상 클래스의 구현입니다. System.ServiceModel.Description.WsdlImporter 유형은 MetadataSet 개체에 번들로 제공된 정책과 함께 WSDL 메타데이터를 가져옵니다.

WSDL 확장을 가져오기 위한 지원을 추가하려면 IWsdlImportExtension 인터페이스를 구현하고 나서 WsdlImportExtensions 인스턴스의 System.ServiceModel.Description.WsdlImporter 속성에 구현을 추가할 수 있습니다. System.ServiceModel.Description.WsdlImporter 클라이언트 애플리케이션 구성 파일에 등록된 인터페이스의 System.ServiceModel.Description.IWsdlImportExtension 구현도 로드할 수 있습니다.

동적 바인딩

엔드포인트에 대한 바인딩이 변경되거나 동일한 계약을 사용하지만 바인딩이 다른 엔드포인트에 대한 채널을 만들려는 경우 서비스 엔드포인트에 대한 채널을 만드는 데 사용하는 바인딩을 동적으로 업데이트할 수 있습니다. 정적 클래스를 MetadataResolver 사용하여 런타임에 특정 계약을 구현하는 서비스 엔드포인트에 대한 메타데이터를 검색하고 가져올 수 있습니다. 그런 다음 가져온 개체를 System.ServiceModel.Description.ServiceEndpoint 사용하여 원하는 엔드포인트에 대한 클라이언트 또는 채널 팩터리를 만들 수 있습니다.

참고하십시오