재우니의 블로그


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