본문 바로가기

IT 살이/04. 기술 - 프로그래밍

[연재 03] Hello world WCF 버전 2

3.  WCF 서비스 구동하기

그림처럼 config 파일을 추가한다.


<
그림3>

추간된 config 파일에 다음 내용을 복사해 넣는다.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<system.serviceModel>

  <services>

  <service

       name="WCFService.HelloService"

       behaviorConfiguration="HelloServiceBehavior">

     <host>

       <!-- 베이스 주소 http://localhost/HelloService로 엔드 포인트가 노출된다.  -->

       <baseAddresses>

         <add baseAddress="http://localhost/HelloService"/>

       </baseAddresses>

     </host>

    

     <endpoint address=""

               binding="wsHttpBinding"

               contract="WCFService.IHelloService" />

     <!-- mex 엔드 포인트는  http://localhost/HelloService/mex 로 노출된다.-->

     <endpoint address="mex"

               binding="mexHttpBinding"

               contract="IMetadataExchange" />

  </service>

  </services>

  <!--디버깅을 위해서, includeExceptionDetailInFaults 어트리뷰트를 true로 설정한다.-->

  <behaviors>

  <serviceBehaviors>

     <behavior name="HelloServiceBehavior">

       <serviceMetadata httpGetEnabled="True"/>

       <serviceDebug includeExceptionDetailInFaults="False" />

     </behavior>

  </serviceBehaviors>

  </behaviors>

</system.serviceModel>

</configuration>

config 파일에는 베이스 주소와 엔드 포인트를 설정하는 내용이 있다.

3.1 베이스 주소 설정하기

베이스 주소는 http://localhost/HelloService로 설정을 하고 있다. 클라이언트에서는 이 주소를 이용해서 서비스를 찾아오게 된다.

<baseAddresses>

         <add baseAddress="http://localhost/HelloService"/>

       </baseAddresses>

3.2 엔드 포인트 설정하기

엔드 포인트(endpoint)들은 메세지를 주고 받는 종점으로서 메세지 교환에 필요한 정보를 정의한다. WCF 서비스는 하나 또는 이상의 애플리케이션 엔드 포인트를 노출시킨다. 클라이언트에서는 서비스에서 노출시킨 엔드 포인트에 맞는 엔드 포인트를 만들어야 한다.

<endpoint address=""

               binding="wsHttpBinding"

               contract="WCFService.IHelloService" />

<endpoint>요소에서 binding 어트리뷰트값을 "wsHttpBinding"으로 설정하고 있는데, 이것은 엔드 포인트의 바인딩으로 시스템이 제공하는 WsHttpBinding을 사용하겠다는 것이다. 이 바인딩은 HTTP를 이용해서 전송한다. 바인딩과 더불어서 엔드 포인트 컨트랙스값으로 IHelloService를 지정하고 있고, address 어트리뷰트값으로 빈 문자열("")을 지정하고 있다. 최종 엔드 포인트의 주소는 앞에서 설정한 베이스 주소와 이곳에서 설정한 주소의 합으로 결정된다.  이 서비스는 상대 주소가 빈 문자열이므로 베이스 주소가 최종 엔드 포인트의 주소가 된다.
상대 주소가 "mex"로 되어 있는 엔드 포인트가 하나 더 설정되어 있다. 이 엔드 포인트는 최종 경로가 http://localhost/HelloService/mex로 노출된다.
.

<!-- mex 엔드 포인트는  http://localhost/HelloService/mex 로 노출된다.-->

     <endpoint address="mex"

               binding="mexHttpBinding"

               contract="IMetadataExchange" />

이 설정은 서비스에 대한 메타 데이터를 노출시키는 메터 데이터 교환(metada exchange, MEX) 엔드 포인트에 대한 것이다. 이 엔드 포인트를 이용하면 클라이언트에서 사용할 수 있는 프록시 클래스와 환경 설정 파일을 얻을 수 있다. 어떻게 이런 파일을 얻게 되는지는 다음 단계에서 보겠다.
3.3 컨솔 호스팅 프로그램 작성하기

다음으로는 서비스를 구동시킬 컨솔 프로그램을 하나 작성한다.
 

<그림4>

그림처럼 HostApplication.cs 파일을 하나 추가하고 다음 코드를 복사해 넣는다.

using System;

using System.Configuration;

using System.ServiceModel;

using System.ServiceModel.Activation;

using System.ServiceModel.Description;

using System.Diagnostics;

namespace WCFService

{

  class HostApplication

  {

       static void Main()

       {

           // 서비스 타입에 맞는 ServiceHost인스턴스를 생성한고, 베이스 주소를 제공한다.

           using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService)))

           {

               try

               {

                   // ServiceHostBase를 오픈하면 리스너를 생성하고 메세지를 리스닝하기 시작한다.

                   serviceHost.Open();

                   // The service can now be accessed.

                   Console.WriteLine("서비스 작동중");

                   Console.WriteLine("서비스를 종료하려면 <ENTER>를 치세요.");

                   Console.WriteLine();

                   Console.ReadLine();

                   // 서비스를 닫기 위해서 ServiceHostBase를 닫는다.

                   serviceHost.Close();

               }

               catch (TimeoutException timeProblem)

               {

                   Console.WriteLine("서비스 오퍼레이션 타임 아웃 예외 " + timeProblem.Message);

               }

               catch (CommunicationException commProblem)

               {

                   Console.WriteLine("통신 문제가 있었습니다. " + commProblem.Message);

               }

           }          

       }   

  }

}