다음을 통해 공유


방법: 구성 파일을 사용하여 서비스의 메타데이터 게시

이 항목은 WCF(Windows Communication Foundation) 서비스의 메타데이터 게시를 보여 주는 두 방법 항목 중 하나입니다. 서비스에서 메타데이터를 게시하는 방법을 지정하는 두 가지 방법은 구성 파일을 사용하는 방법과 코드를 사용하는 방법입니다. 이 항목에서는 구성 파일을 사용하여 서비스에 대해 메타데이터를 게시하는 방법에 대해 설명합니다.

ms734765.Caution(ko-kr,VS.100).gif주의:
이 항목에서는 보호되지 않은 방식으로 메타데이터를 게시하는 방법을 보여 줍니다. 즉, 모든 클라이언트가 서비스에서 메타데이터를 검색할 수 있습니다. 서비스에서 보호되는 방식으로 메타데이터를 게시해야 하는 경우에는 Custom Secure Metadata Endpoint를 참조하십시오.

코드에서 메타데이터를 게시하는 방법에 대한 자세한 내용은 방법: 코드를 사용하여 서비스에 대한 메타데이터 게시를 참조하십시오. 메타데이터를 게시하면 클라이언트에서 WS-Transfer GET 요청을 사용하는 메타데이터 또는 ?wsdl 쿼리 문자열을 사용하는 HTTP/GET 요청을 검색할 수 있습니다. 코드가 작동 중인지 확인하려면 기본 WCF 서비스를 만듭니다. 편의상 다음 코드로 된 기본 자체 호스팅 서비스가 제공됩니다.

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(SimpleService),
                new Uri("https://localhost:8001/MetadataSample")); 
            try
            {
                // Open the service host to accept incoming calls
                host.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                host.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}

이 서비스는 구성 파일을 사용하여 구성된 자체 호스팅 서비스입니다. 다음 구성 파일을 사용해 작업을 시작합니다.

<configuration>
  <system.serviceModel>
    <services>
      <service name="Metadata.Example.SimpleService">
        <endpoint address=""
                  binding="basicHttpBinding"
                  contract="Metadata.Example.ISimpleService" />
      </service>
    </services>
    <behaviors>
      
    </behaviors>
  </system.serviceModel>
</configuration>

응용 프로그램 구성 파일을 사용하여 WCF 서비스의 메타데이터를 게시하려면

  1. App.config 파일 내에서 </services><behaviors> 요소를 닫은 후 요소를 만듭니다.

    <behaviors>
    
    </behaviors>
    
  2. <behaviors> <serviceBehaviors> 요소 내에서 요소를 추가합니다.

    <behaviors>
      <serviceBehaviors>
    
      </serviceBehaviors>
    </behaviors>
    
  3. <behavior><serviceBehaviors> 요소를 name 요소에 추가하고 <behavior> 요소의 특성에 값을 지정합니다.

    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
    
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  4. <serviceMetadata> <behavior> 요소를 요소에 추가합니다. httpGetEnabled 특성을 true로 설정하고 policyVersion 특성을 Policy15로 설정합니다. httpGetEnabled를 사용하면 서비스가 HTTP GET 요청으로 수행된 메타데이터 요청에 응답할 수 있습니다. policyVersion에 따라 서비스는 메타데이터를 생성할 때 WS-Policy 1.5를 준수합니다.

    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  5. 다음 코드 예제와 같이 behaviorConfiguration 특성을 <service> 요소에 추가하고 1단계에 추가된 <behavior> 요소의 name 특성을 지정합니다.

    <services>
      <service
          name="Metadata.Example.SimpleService"
          behaviorConfiguration="SimpleServiceBehavior">
        ...
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
  6. 다음 코드 예제와 같이 계약이 IMetadataExchange로 설정된 하나 이상의 <endpoint> 요소를 추가합니다.

    <services>
      <service
          name="Metadata.Example.SimpleService"
          behaviorConfiguration="SimpleServiceBehavior">
    
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Metadata.Example.ISimpleService" />
    
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    
  7. 이전 단계에 추가된 메타데이터 끝점에 대해 binding 특성을 다음 중 하나로 설정합니다.

    • HTTP 게시의 경우 mexHttpBinding

    • HTTPS 게시의 경우 mexHttpsBinding

    • 명명된 파이프 게시의 경우 mexNamedPipeBinding

    • TCP 게시의 경우 mexTcpBinding

  8. 이전 단계에 추가된 메타데이터 끝점에 대해 주소를 다음과 같이 설정합니다.

    • 기본 주소가 메타데이터 바인딩과 동일한 경우 호스트 응용 프로그램의 기본 주소를 게시 지점으로 사용하는 빈 문자열

    • 호스트 응용 프로그램에 기본 주소가 있는 경우 상대 주소

    • 절대 경로

  9. 콘솔 응용 프로그램을 빌드하고 실행합니다.

  10. Internet Explorer를 사용하여 서비스의 기본 주소(이 샘플에서는 https://localhost:8001/MetadataSample)를 찾아 메타데이터 게시가 설정되어 있는지 확인합니다. 그렇지 않으면 "이 서비스에 대한 메타데이터 게시는 현재 사용할 수 없습니다."라는 메시지가 결과 페이지의 맨 위에 표시됩니다.

기본 끝점을 사용하려면

  1. 기본 끝점을 사용하는 서비스에서 메타데이터를 구성하려면 이전 예제와 같이 구성 파일에 ServiceMetadataBehavior를 구성하되 끝점은 지정하지 마십시오. 이렇게 구성하면 구성 파일이 다음과 같아집니다.

    <configuration>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="SimpleServiceBehavior">
              <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
      </system.serviceModel>
    </configuration>
    

    서비스에 포함된 ServiceMetadataBehaviorhttpGetEnabledtrue로 설정되어 있으므로 서비스의 메타데이터 게시 기능은 사용하도록 설정되었으며, 끝점을 명시적으로 추가하지 않았으므로 런타임이 기본 끝점을 추가합니다. 기본 끝점, 바인딩 및 동작에 대한 자세한 내용은 단순화된 구성Simplified Configuration for WCF Services을 참조하십시오.

예제

다음 코드 예제에서는 기본 WCF 서비스의 구현 및 서비스의 메타데이터를 게시하는 구성 파일을 보여 줍니다.

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(SimpleService),
                new Uri("https://localhost:8001/MetadataSample")); 
            try
            {
                // Open the service host to accept incoming calls
                host.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                host.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

참고 항목

작업

방법: 관리되는 응용 프로그램에서 WCF 서비스 호스팅
Self-Host
방법: 코드를 사용하여 서비스에 대한 메타데이터 게시

참조

ServiceMetadataBehavior

개념

메타데이터 아키텍처 개요
메타데이터 사용