wcf_rest.zip
여기서는 이론은 접어두고, REST 를 WCF 환경에서 어떻게 사용할 수 있는지만 이야기 할 것이다.
1. 먼저 Books 라는 테이블을 만듭니다. REST 를 테스트를 위한 CRUD 를 확인해 볼 것이기 때문이다.
2. 해당 테이블로 ENTITY FRAMEWORK 에 올리고 OEM 방식으로 구현한다.
자세한건.. 여기 An Introduction to Entity Framework for Absolute Beginners
3. 이제 WCF 를 만들어보자.
ServiceContract 인터페이스 를 구현합니다.
여기서 서비스를 제공하기 위해 ServiceContract 어트리뷰트를 interface 에 할당합니다.
그리고 REST 의 GET , PUT, POST, DELETE 의 HTTP METHOD 를 정의하기 위해, 먼저 GET 은 WebGet 어트리뷰트를 명시합니다. 대신 PUT, POST, DELETE 는 WebInvoke 어트리뷰트를 사용합니다. UriTemplate 은 HTTP URL 을 정의합니다. 기본은 XML 형태이며, JSON 을 반환할 경우, 응답 형식을 WebMessageFormat.Json 로 지정합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace WcfRestSample
{
[ServiceContract]
public interface IBookService
{
[OperationContract]
[WebGet]
List GetBooksList();
[OperationContract]
[WebGet(UriTemplate = "Book/{id}")]
Books GetBookById(string id);
[OperationContract]
[WebInvoke(UriTemplate = "AddBook/{name}")]
void AddBook(string name);
[OperationContract]
[WebInvoke(UriTemplate = "UpdateBook/{id}/{name}")]
void UpdateBook(string id, string name);
[OperationContract]
[WebInvoke(UriTemplate = "DeleteBook/{id}")]
void DeleteBook(string id);
[OperationContract]
[WebGet(ResponseFormat=WebMessageFormat.Json)]
List GetBooksNames();
}
}
이젠 구상클래스를 만들어 보겠습니다.
public class BookService : IBookService
{
public List GetBooksList()
{
using (SampleDbEntities entities = new SampleDbEntities())
{
return entities.Books.ToList();
}
}
public Book GetBookById(string id)
{
try
{
int bookId = Convert.ToInt32(id);
using (SampleDbEntities entities = new SampleDbEntities())
{
return entities.Books.SingleOrDefault(book => book.ID == bookId);
}
}
catch
{
throw new FaultException("Something went wrong");
}
}
public void AddBook(string name)
{
using (SampleDbEntities entities = new SampleDbEntities())
{
Book book = new Book { BookName = name };
entities.Books.AddObject(book);
entities.SaveChanges();
}
}
public void UpdateBook(string id, string name)
{
try
{
int bookId = Convert.ToInt32(id);
using (SampleDbEntities entities = new SampleDbEntities())
{
Book book = entities.Books.SingleOrDefault(b => b.ID == bookId);
book.BookName = name;
entities.SaveChanges();
}
}
catch
{
throw new FaultException("Something went wrong");
}
}
public void DeleteBook(string id)
{
try
{
int bookId = Convert.ToInt32(id);
using (SampleDbEntities entities = new SampleDbEntities())
{
Book book = entities.Books.SingleOrDefault(b => b.ID == bookId);
entities.Books.DeleteObject(book);
entities.SaveChanges();
}
}
catch
{
throw new FaultException("Something went wrong");
}
}
}
WEB.CONFIG 는 이를 가지고 매칭하는 작업을 해야 합니다.
REST 프로토콜을 생성하기 위해 webHttpBinding 로 바인딩 명시 해야 합니다.
아래 endpointBehaviors 환경 설정을 해야 합니다 . endpointBehaviors 파라미터에 WebHttp 를 설정 및 명시합니다.
<system.serviceModel>
<services>
<service name="WcfRestSample.BookService">
<endpoint address="" behaviorConfiguration="restfulBehavior"
binding="webHttpBinding" bindingConfiguration=""
contract="WcfRestSample.IBookService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost/bookservice" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="restfulBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
실행 해 볼까요?
http://localhost:53215/bookservice/GetBooksList