메타데이터 아키텍처 개요
WCF(Windows Communication Foundation)는 서비스 메타데이터의 내보내기, 게시, 검색 및 가져오기를 위한 풍부한 인프라를 제공합니다. WCF 서비스는 Svcutil.exe와 같은 도구가 서비스 액세스를 위해 클라이언트 코드에 자동으로 액세스할 수 있도록 메타데이터를 사용하여 서비스의 엔드포인트와 상호 작용하는 방법을 설명합니다.
WCF 메타데이터 인프라를 구성하는 대부분의 형식은 System.ServiceModel.Description 네임스페이스에 있습니다.
WCF는 ServiceEndpoint 클래스를 사용하여 서비스의 엔드포인트를 설명합니다. WCF를 사용하여 서비스 엔드포인트에 대한 메타데이터를 생성하거나 서비스 메타데이터를 가져와서 ServiceEndpoint 인스턴스를 생성할 수 있습니다.
WCF는 서비스에 대한 메타데이터를 MetadataSet 형식의 인스턴스로 나타내는데, 이 형식의 구조체는 WS-MetadataExchange에 정의된 메타데이터 serialization 형식에 강하게 연결되어 있습니다. MetadataSet 형식은 WSDL(웹 서비스 기술 언어) 문서, XML 스키마 문서 또는 WS-Policy 식과 같은 실제 서비스 메타데이터를 MetadataSection 인스턴스의 컬렉션으로 묶습니다. System.ServiceModel.Description.MetadataSection 인스턴스마다 특정 메타데이터 언어와 식별자가 포함되어 있습니다. System.ServiceModel.Description.MetadataSection에는 해당 MetadataSection.Metadata 속성에 다음과 같은 항목이 포함될 수 있습니다.
원시 메타데이터
MetadataReference 인스턴스입니다.
MetadataLocation 인스턴스입니다.
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 구현은 MetadataSet 인스턴스에 캡슐화된 메타데이터를 생성합니다.
ph x="1" /> 클래스는 엔드포인트 바인딩의 기능 및 요구 사항과 관련 작업, 메시지 및 오류에 대해 설명하는 정책 식을 생성하는 데 필요한 프레임워크를 제공합니다. 이러한 정책 식은 PolicyConversionContext 인스턴스에 캡처됩니다. 그런 다음 System.ServiceModel.Description.MetadataExporter 구현은 생성된 메타데이터에 이러한 정책 식을 연결할 수 있습니다.
System.ServiceModel.Description.MetadataExporter는 사용할 System.ServiceModel.Description.MetadataExporter 구현에 대한 PolicyConversionContext 개체를 생성할 때 ServiceEndpoint 바인딩에서 IPolicyExportExtension 인터페이스를 구현하는 각 System.ServiceModel.Channels.BindingElement를 호출합니다. BindingElement 형식의 사용자 지정 구현에 IPolicyExportExtension 인터페이스를 구현하여 새 정책 어설션을 내보낼 수 있습니다.
WsdlExporter 형식은 WCF에 포함된 System.ServiceModel.Description.MetadataExporter 추상 클래스의 구현입니다. WsdlExporter 형식은 첨부된 정책 식을 사용하여 WSDL 메타데이터를 생성합니다.
서비스 엔드포인트에서 엔드포인트 동작, 계약 동작 또는 바인딩 요소에 대한 사용자 지정 WSDL 메타데이터 또는 WSDL 확장을 내보내려면 IWsdlExportExtension 인터페이스를 구현합니다. WsdlExporter는 WSDL 문서를 생성할 때 ServiceEndpoint 인터페이스를 구현하는 바인딩 요소, 작업 동작, 계약 동작 및 엔드포인트 동작에 대한 IWsdlExportExtension 인스턴스를 조사합니다.
서비스 메타데이터 게시
WCF 서비스는 하나 이상의 메타데이터 엔드포인트를 노출하여 메타데이터를 게시합니다. 서비스 메타데이터를 게시하면 MEX 및 HTTP/GET 요청과 같이 표준화된 프로토콜을 통해 서비스 메타데이터를 사용할 수 있습니다. 메타데이터 엔드포인트는 주소, 바인딩 및 계약이 포함된 다른 서비스 엔드포인트와 유사합니다. 구성 또는 코드를 통해 서비스 호스트에 메타데이터 엔드포인트를 추가할 수 있습니다.
WCF 서비스의 메타데이터 엔드포인트를 게시하려면 먼저 ServiceMetadataBehavior 서비스 동작의 인스턴스를 해당 서비스에 추가해야 합니다. ph x="1" /> 인스턴스를 서비스에 추가하면 하나 이상의 메타데이터 엔드포인트를 노출하여 메타데이터를 게시하는 기능으로 서비스가 보완됩니다. ph x="1" /> 서비스 동작을 추가하면 MEX 프로토콜을 지원하거나 HTTP/GET 요청에 응답하는 메타데이터 엔드포인트를 노출할 수 있습니다.
MEX 프로토콜을 사용하는 메타데이터 엔드포인트를 추가하려면 IMetadataExchange라는 서비스 계약을 사용하는 서비스 호스트에 서비스 엔드포인트를 추가합니다. WCF는 이 서비스 계약 이름을 갖는 IMetadataExchange 인터페이스를 정의합니다. WS-MetadataExchange 엔드포인트 또는 MEX 엔드포인트는 MetadataExchangeBindings 클래스에서 정적 팩터리 메서드에 의해 노출되는 4개의 기본 바인딩 중 하나를 사용하여 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를 추가하는 방법에 대한 예를 보려면 자체 호스팅 샘플을 참조하세요.
주의
각각 같은 이름의 작업이 포함된 서로 다른 두 서비스 계약을 노출하는 서비스에 대해 메타데이터를 게시할 때는 예외가 throw됩니다. 예를 들어 Get(Car c) 작업이 포함된 ICarService 서비스 계약을 노출하는 서비스가 Get(Book b) 작업이 포함된 IBookService 서비스 계약도 노출하는 경우에는 서비스 메타데이터를 생성할 때 예외가 throw되거나 오류 메시지가 표시됩니다. 이 문제를 해결하려면 다음 중 하나를 수행합니다.
서비스 메타데이터 검색
WCF에서는 WS-MetadataExchange 및 HTTP와 같은 표준화된 프로토콜을 통해 서비스 메타데이터를 검색할 수 있습니다. 이러한 프로토콜은 모두 MetadataExchangeClient 형식에서 지원합니다. 주소 및 선택적 바인딩을 제공하여 System.ServiceModel.Description.MetadataExchangeClient 형식을 사용한 서비스 메타데이터를 검색합니다. ph x="1" /> 인스턴스에서 사용되는 바인딩은 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가 있을 경우 Svcutil.exe에 전달된 주소 스키마와 이름이 같은 MEX 엔드포인트 구성을 애플리케이션 구성 파일에서 로드합니다. 그렇지 않으면 Svcutil.exe는 기본적으로 MetadataExchangeBindings 정적 팩터리 형식에 정의된 바인딩 중 하나를 사용합니다.
서비스 메타데이터 가져오기
WCF에서 메타데이터 가져오기는 해당 메타데이터에서 서비스 또는 해당 구성 요소 부분의 추상적 표현을 생성하는 프로세스입니다. 예를 들면, WCF에서는 ServiceEndpoint 인스턴스, Binding 인스턴스 또는 ContractDescription 인스턴스를 서비스의 WSDL 문서에서 가져올 수 있습니다. WCF에서 서비스 메타데이터를 가져오려면 MetadataImporter 추상 클래스의 구현을 사용합니다. System.ServiceModel.Description.MetadataImporter 클래스에서 파생되는 형식은 WCF에서 WS-Policy 가져오기 논리를 사용하는 메타데이터 형식 가져오기에 대한 지원을 구현합니다.
System.ServiceModel.Description.MetadataImporter 구현은 PolicyConversionContext 개체의 서비스 메타데이터에 첨부된 정책 식을 수집합니다. 그런 다음 System.ServiceModel.Description.MetadataImporter는 PolicyImportExtensions 속성에서 IPolicyImportExtension 인터페이스 구현을 호출하여 메타데이터 가져오기의 일부로 정책을 처리합니다.
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 메타데이터를 가져옵니다.
IWsdlImportExtension 인터페이스를 구현한 다음 System.ServiceModel.Description.WsdlImporter 인스턴스의 WsdlImportExtensions 속성에 구현을 추가하여 WSDL 확장 가져오기에 대한 지원을 추가할 수 있습니다. System.ServiceModel.Description.WsdlImporter에서 클라이언트 애플리케이션 구성 파일에 등록된 System.ServiceModel.Description.IWsdlImportExtension 인터페이스의 구현을 로드할 수도 있습니다.
동적 바인딩
엔드포인트에 대한 바인딩이 변경된 경우 또는 같은 계약을 사용하지만 다른 바인딩이 있는 엔드포인트에 대한 채널을 만들려는 경우 서비스 엔드포인트에 대한 채널을 만드는 데 사용하는 바인딩을 동적으로 업데이트할 수 있습니다. MetadataResolver 정적 클래스를 사용하여 특정 계약을 구현하는 서비스 엔드포인트에 대한 메타데이터를 런타임에 검색하고 가져올 수 있습니다. 그런 다음 가져온 System.ServiceModel.Description.ServiceEndpoint 개체를 사용하여 원하는 엔드포인트에 대한 클라이언트 또는 채널 팩터리를 만들 수 있습니다.