메타데이터 게시 동작

Metadata 샘플은 서비스의 기능을 게시하는 메타데이터를 제어하는 방법을 보여 줍니다. 잠재적으로 중요한 서비스 메타데이터가 의도하지 않게 공개되는 것을 방지하기 위해 WCF(Windows Communication Foundation) 서비스의 기본 구성은 메타데이터 게시를 사용하지 않도록 설정합니다. 이 동작은 기본적으로 안전하지만 구성에서 서비스의 메타데이터 게시 동작이 명시적으로 사용하도록 설정되어 있지 않은 경우 Svcutil.exe 등의 메타데이터 가져오기 도구를 사용하여 서비스를 호출하는 데 필요한 클라이언트 코드를 생성할 수 없습니다.

Important

쉽게 구별할 수 있도록 이 샘플에서는 보안이 설정되지 않은 메타데이터 게시 엔드포인트를 만드는 방법을 보여 줍니다. 이러한 엔드포인트는 인증되지 않은 익명의 소비자가 사용할 수 있으므로 이러한 엔드포인트를 배포하기 전에 서비스의 메타데이터를 공개하는 것이 적절한지 주의를 기울여야 합니다. 메타데이터 엔드포인트를 보호하는 샘플은 Custom Secure Metadata Endpoint 샘플을 참조하세요.

샘플은 ICalculator 서비스 계약을 구현하는 시작하기를 기반으로 합니다. 이 샘플에서 클라이언트는 콘솔 애플리케이션(.exe)이고 서비스는 IIS(인터넷 정보 서비스)를 통해 호스트됩니다.

참고 항목

이 샘플의 설치 절차 및 빌드 지침은 이 항목의 끝부분에 나와 있습니다.

서비스에서 메타데이터를 노출하려면 서비스에 ServiceMetadataBehavior가 구성되어야 합니다. 이 동작이 존재하는 경우 IMetadataExchange 계약을 WS-MetadataExchange(MEX) 프로토콜의 구현으로 노출하도록 엔드포인트를 구성함으로써 메타데이터를 게시할 수 있습니다. 편의상 이 계약에는 "IMetadataExchange"라는 약식 구성 이름이 지정되었습니다. 이 샘플에서는 보안 모드가 mexHttpBinding으로 설정된 wsHttpBinding과 동일한 None이라는 편리한 표준 바인딩을 사용합니다. “mex”의 상대 주소가 엔드포인트에서 사용되며, 서비스 기준 주소에 대해 해결될 때 엔드포인트 주소는 http://localhost/servicemodelsamples/service.svc/mex가 됩니다. 다음에서는 동작 구성을 보여 줍니다.

<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <!-- The serviceMetadata behavior publishes metadata through
           the IMetadataExchange contract. When this behavior is
           present, you can expose this contract through an endpoint
           as shown below. Setting httpGetEnabled to true publishes
           the service's WSDL at the <baseaddress>?wsdl, for example,
           http://localhost/servicemodelsamples/service.svc?wsdl -->
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

다음에서는 MEX 엔드포인트를 보여 줍니다.

<!-- the MEX endpoint is exposed at
     http://localhost/servicemodelsamples/service.svc/mex
     To expose the IMetadataExchange contract, you
     must enable the serviceMetadata behavior as demonstrated
     previously. -->
<endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />

이 샘플에서는 HttpGetEnabled 속성을 true로 설정하며, 따라서 HTTP GET을 사용하여 서비스의 메타데이터를 노출합니다. HTTP GET 메타데이터 엔드포인트를 사용하려면 서비스가 HTTP 기본 주소를 가져야 합니다. 서비스의 기본 주소에 쿼리 문자열 ?wsdl을 사용하여 메타데이터에 액세스합니다. 예를 들어 웹 브라우저에서 서비스의 WSDL을 보려면 http://localhost/servicemodelsamples/service.svc?wsdl이라는 주소를 사용합니다. 또는 HttpsGetEnabledtrue로 설정하여 HTTPS를 통해 메타데이터를 노출하는 데 이 동작을 사용할 수 있습니다. 이 경우 HTTPS 기본 주소가 필요합니다.

서비스의 MEX 엔드포인트에 액세스하려면 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)를 사용합니다.

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs

그러면 서비스의 메타데이터를 기준으로 클라이언트가 생성됩니다.

HTTP GET을 사용하여 서비스의 메타데이터에 액세스하려면 브라우저에서 http://localhost/servicemodelsamples/service.svc?wsdl로 이동합니다.

이 동작을 제거하고 서비스를 열려고 시도하면 예외가 발생합니다. 이 동작이 없으면 IMetadataExchange 계약이 구성된 엔드포인트에 구현이 없으므로 그러한 오류가 발생합니다.

HttpGetEnabledfalse로 설정할 경우 서비스의 메타데이터 대신 CalculatorService 도움말 페이지가 나타납니다.

샘플을 설치, 빌드 및 실행하려면

  1. Windows Communication Foundation 샘플의 일회 설치 절차를 수행했는지 확인합니다.

  2. C# 또는 Visual Basic .NET 버전의 솔루션을 빌드하려면 Building the Windows Communication Foundation Samples의 지침을 따릅니다.

  3. 단일 컴퓨터 또는 다중 컴퓨터 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플 실행의 지침을 따릅니다.