다음을 통해 공유


방법: 코드를 사용하여 서비스에 대한 메타데이터 게시

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

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

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

Imports System
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description

<ServiceContract()> _
Public Interface ISimpleService
    <OperationContract()> _
    Function SimpleMethod(ByVal msg As String) As String
End Interface

Class SimpleService
    Implements ISimpleService

    Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
        Console.WriteLine("The caller passed in " + msg)
        Return "Hello " + msg
    End Function
End Class
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;
        }
    }

코드에서 메타데이터를 게시하려면

  1. 콘솔 응용 프로그램의 main 메서드 내에서 서비스 형식 및 기본 주소를 전달하여 ServiceHost 개체를 인스턴스화합니다.

    Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("https://localhost:8001/MetadataSample"))
    
    ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("https://localhost:8001/MetadataSample"));
    
  2. 1단계의 코드 바로 아래에 try 블록을 만듭니다. 이렇게 하면 서비스가 실행되는 동안 throw된 예외가 catch됩니다.

    Try
    
    try
    {
    
    Catch commProblem As CommunicationException
    
        Console.WriteLine("There was a communication problem. " + commProblem.Message)
        Console.Read()
    End Try
    
    }
    catch (CommunicationException commProblem)
    {
        Console.WriteLine("There was a communication problem. " + commProblem.Message);
        Console.Read();
    }
    
  3. 서비스 호스트에 ServiceMetadataBehavior가 포함되어 있는지 여부를 확인합니다. 포함되지 않은 경우에는 새 ServiceMetadataBehavior 인스턴스를 만듭니다.

    'Check to see if the service host already has a ServiceMetadataBehavior
    Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
    'If not, add one
    If (smb Is Nothing) Then
        smb = New ServiceMetadataBehavior()
    End If
    
    // Check to see if the service host already has a ServiceMetadataBehavior
    ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
    // If not, add one
    if (smb == null)
        smb = new ServiceMetadataBehavior();
    
  4. HttpGetEnabled 속성을 true로 설정합니다.

    smb.HttpGetEnabled = True
    
    smb.HttpGetEnabled = true;
    
  5. ServiceMetadataBehaviorMetadataExporter 속성이 포함됩니다. MetadataExporterPolicyVersion 속성이 포함됩니다. PolicyVersion 속성 값을 Policy15로 설정합니다. PolicyVersion 속성을 Policy12로 설정할 수도 있습니다. Policy15로 설정된 경우, 메타데이터 내보내기는 WS-Policy 1.5를 준수하는 메타데이터로 정책 정보를 생성합니다. Policy12로 설정된 경우, 메타데이터 내보내기는 WS-Policy 1.2를 준수하는 정책 정보를 생성합니다.

    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
    
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    
  6. 서비스 호스트의 동작 컬렉션에 ServiceMetadataBehavior 인스턴스를 추가합니다.

    svcHost.Description.Behaviors.Add(smb)
    
    svcHost.Description.Behaviors.Add(smb);
    
  7. 서비스 호스트에 메타데이터 교환 끝점을 추가합니다.

    'Add MEX endpoint
    svcHost.AddServiceEndpoint( _
          ServiceMetadataBehavior.MexContractName, _
          MetadataExchangeBindings.CreateMexHttpBinding(), _
          "mex")
    
    // Add MEX endpoint
    svcHost.AddServiceEndpoint(
      ServiceMetadataBehavior.MexContractName,
      MetadataExchangeBindings.CreateMexHttpBinding(),
      "mex"
    );
    
  8. 서비스 호스트에 응용 프로그램 끝점을 추가합니다.

    'Add application endpoint
    svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
    
    // Add application endpoint
    svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
    
    Aa738489.note(ko-kr,VS.100).gif참고:
    서비스에 끝점을 추가하지 않으면 런타임에서 기본 끝점을 자동으로 추가합니다. 이 예제에서는 서비스의 ServiceMetadataBehaviortrue로 설정되어 있으므로 서비스의 메타데이터 게시 기능이 사용하도록 설정되었습니다. 기본 끝점에 대한 자세한 내용은 단순화된 구성Simplified Configuration for WCF Services을 참조하십시오.

  9. 서비스 호스트를 열고 들어오는 호출을 기다립니다. 사용자가 Enter 키를 누르면 서비스 호스트가 닫힙니다.

    'Open the service host to accept incoming calls
    svcHost.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.
    svcHost.Close()
    
    // Open the service host to accept incoming calls
    svcHost.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.
    svcHost.Close();
    
  10. 콘솔 응용 프로그램을 빌드하고 실행합니다.

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

예제

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

Imports System
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description

<ServiceContract()> _
Public Interface ISimpleService
    <OperationContract()> _
    Function SimpleMethod(ByVal msg As String) As String
End Interface

Class SimpleService
    Implements ISimpleService

    Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
        Console.WriteLine("The caller passed in " + msg)
        Return "Hello " + msg
    End Function
End Class

Module Module1

    Sub Main()
        Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("https://localhost:8001/MetadataSample"))
        Try
            'Check to see if the service host already has a ServiceMetadataBehavior
            Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
            'If not, add one
            If (smb Is Nothing) Then
                smb = New ServiceMetadataBehavior()
            End If
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            svcHost.Description.Behaviors.Add(smb)
            'Add MEX endpoint
            svcHost.AddServiceEndpoint( _
                  ServiceMetadataBehavior.MexContractName, _
                  MetadataExchangeBindings.CreateMexHttpBinding(), _
                  "mex")
            'Add application endpoint
            svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
            'Open the service host to accept incoming calls
            svcHost.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.
            svcHost.Close()
        Catch commProblem As CommunicationException

            Console.WriteLine("There was a communication problem. " + commProblem.Message)
            Console.Read()
        End Try
    End Sub
End Module
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 svcHost = new ServiceHost(typeof(SimpleService), new Uri("https://localhost:8001/MetadataSample"));
            try
            {
                // Check to see if the service host already has a ServiceMetadataBehavior
                ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
                // If not, add one
                if (smb == null)
                    smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                svcHost.Description.Behaviors.Add(smb);
                // Add MEX endpoint
                svcHost.AddServiceEndpoint(
                  ServiceMetadataBehavior.MexContractName,
                  MetadataExchangeBindings.CreateMexHttpBinding(),
                  "mex"
                );
                // Add application endpoint
                svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
                // Open the service host to accept incoming calls
                svcHost.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.
                svcHost.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}

참고 항목

작업

방법: 관리되는 응용 프로그램에서 WCF 서비스 호스팅
Self-Host
방법: 구성 파일을 사용하여 서비스의 메타데이터 게시

개념

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