시행착오 스토리/카카오봇
#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 형태의 결과값을 받게 된다면 성공이다.