본문 바로가기
시행착오 스토리/카카오봇

#3 카카오 자동응답 API로 카카오봇 만들기 - WCF Service 서버 구현

by 양벨라 2017. 8. 31.



WCF Service를 이용하여 서버 구현하기


이번에는 C#으로 서버를 구성하면서 알게된 WCF(Windows Communication Foundation)Service를 이용해보려고 한다. wcf는 클라이언트와 메시지를 주고 받기 위해 Endpoint를 제공한다. Endpoint는 Address, Binding, Contract로 구성되고 이를 WCF의 ABC 로 부른다. 간단하게 말하면 Address는 서비스가 위치한 주소, Binding은 통신 방법, Contract는 서비스가 제공하는 기능을 정의하는 것이다. 한 번 해보면 정말 쉽고 편한 방법이라고 생각이 드는데 처음 구성할 때는 어떤 타입의 프로젝트를 추가하는지, 어떻게 Contract를 정의하는지 원하는대로 되지 않아서 시도해보는 기간이 길었다. visual studio 가 있어야 한다.

1. WCF Service Contract 프로젝트 생성

이하 ServiceInterface


C# 클래스 라이브러리 타입으로 프로젝트를 추가한다.
② System.ServiceModel, System.ServiceModel.Web, System.Runtime.Serialization을 참조 추가한다.
③ 자동 추가된 cs파일의 이름을 Iservice.cs로 수정하여 내용을 작성한다.


ServiceInterface에서는 서버 메소드들의 Interface를 정의한다. 즉, 서비스의 Contract 정의를 위해 인터페이스를 선언하는 부분이다. 반드시 서비스모델의 네임스페이스에 명시되어야 한다.
/* Iservice.cs */
using System.ServiceModel; //ServiceContract,
using System.ServiceModel.Web; //WebInvoke
using System.Runtime.Serialization; //DataContract

namespace ServiceInterface
{
    //Contract 선언
    [ServiceContract]
    public Interface IService
    {
       [OperationContract]
       [WebInvoke(Method="GET", ResponseFormat = WebMessageFormat.Json)]
       KeyboardRes keyboard();
    }

    [DataContract]
    public class KeyboardRes
    {
       [DataMember]
       public string type{ get;set;}
     }
}

여기서 서비스의 이름을 keyboard로 정해준 것을 볼 수 있는데 이 이유는 앞의 글과 동일하게 카카오 API 명세를 따르기 위함이다.

2. 콘솔서버어플리케이션용 WCF Service 생성

이하 ConsoleServer


C# 콘솔 어플리케이션 타입으로 프로젝트를 추가한다.
② System.ServiceModel, System.ServiceModel.Web 두 가지와 앞에 만들었던 ServiceInterface를 참조 추가한다.
③ Service.cs를 추가하여 Iservice에 정의된 메소드들을 구현해준다.
/* Service.cs */
using ServiceInterface;

public class Service : IService{
   public KeyboardRes keyboard(){
     return _keyboard();
   }

     KeyboardRes _keyboard(){
     KeyboardRes res = new KeyboardRes();
     res.type = "text";
     return res;
   }
}

④ Program.cs를 수정한다.

WCF Service를 호스팅할 부분이다. 여기서 신경써주어야 할 부분은 endpoint를 설정하는 부분이다. WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost")); 에서 localhost를 Address로 설정했다.
다음 줄 host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(),""); 에서 Contract부분을 IService로, Binding은 WebHttpBinding으로 설정했다. 그리고 " " 부분은 endpoint의 이름을 설정하는 부분인데 비워뒀다. 그래서 결국 베이스 주소는 "http://localhost/"이다. 만약 주소를 "http://localhost/dearjiya"로 주고 싶으면 endpoint의 이름을 설정하는 곳에 " " 대신 "dearjiya"로 수정하면 된다.
/* Program.cs */

using System.ServiceModel;
using ServiceInterface;
class Program {
    static void Main(string[] args){
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost"));
     host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(),"");

     try{
       host.open();
       Console.WriteLine("Hi! Press <enter> to terminate");
       Console.ReadLine();
       host.close();
     }
     catch(CommunicationException e){
       Console.WriteLine("Excetpion: {0}", e.Message);
       host.Abort();
     }
   }
}

3. IIS용 WCF Service 생성

이하 IisServer


WCF 어플리케이션 타입으로 프로젝트를 추가한다.
② 역시나 System.ServiceModel, System.ServiceModel.Web 두 가지와 앞에 만들었던 ServiceInterface를 참조 추가한다.
/* Service.svc.cs */
using ServiceInterface;

public class Service : IService{
     //Service.cs와 동일하게 구현
   .
   .
}

③ Web.config를 수정한다.
/* Web.config */

<?xml version ="1.0"?>
<configuration>
  <system.serviceModel>>
    <services>
      <service name="IisServer.Service">
        <endpoint address="Http"
                  binding="webHttpBinding"
                  contract="ServiceInterface.IService"
                  behaviorConfiguration="webHttp"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

이제 테스트해본다. ConsoleServer의 Program.cs를 실행시킨다면 아래와 같은 결과창이 뜨는 것을 확인 할 수 있다.



서버는 실행되고 있으니 이제 GET요청을 해본다. 아까 정했던 대로 http://localhost/keyboard로 요청한다.


이렇게 Json 형태의 결과값을 받게 된다면 성공이다.