첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

728x90
반응형

▶ BookInfo.cs (서버)

using System;
using System.Runtime.Serialization;

namespace TestProject
{
    /// <summary>
    /// 도서 정보
    /// </summary>
    [Serializable]
    public class BookInfo
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// ISBN
        /// </summary>
        public string ISBN;

        [OptionalField]
        public string Author;

        [OptionalField]
        public int Price;

        [NonSerialized]
        public double MarginRate;

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 제목
        /// </summary>
        [OptionalField]
        private string title;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 제목 - Title

        /// <summary>
        /// 제목
        /// </summary>
        public string Title
        {
            get
            {
                return this.title;
            }
            set
            {
                this.title = value;
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - BookInfo(title, isbn, author, price)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="title">제목</param>
        /// <param name="isbn">ISBN</param>
        /// <param name="author">저자</param>
        /// <param name="price">가격</param>
        public BookInfo(string title, string isbn, string author, int price)
        {
            this.title = title;
            ISBN       = isbn;
            Author     = author;
            Price      = price;
            MarginRate = 0.25;
        }

        #endregion
    }
}

 

▶ IBookStore.cs (서버)

using System.ServiceModel;

namespace TestProject
{
    /// <summary>
    /// 상점 인터페이스
    /// </summary>
    [ServiceContract(Namespace = "http://company.com/bookstore")]
    public interface IBookStore
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        #region 도서 정보 구하기 - GetBookInfo(isbn)

        /// <summary>
        /// 도서 정보 구하기
        /// </summary>
        /// <param name="isbn">ISBN</param>
        /// <returns>도서 정보</returns>
        [OperationContract]
        BookInfo GetBookInfo(string isbn);

        #endregion
    }
}

 

▶ BookStoreService.cs (서버)

using System.Collections.Generic;
using System.ServiceModel;

namespace TestProject
{
    /// <summary>
    /// 상점 서비스
    /// </summary>
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class BookStoreService : IBookStore
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 도서 정보 딕셔너리
        /// </summary>
        private static Dictionary<string, BookInfo> _bookInfoDictionary = new Dictionary<string, BookInfo>();

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Static

        #region 생성자 - BookStoreService()

        /// <summary>
        /// 생성자
        /// </summary>
        static BookStoreService()
        {
            BookInfo bookInfo;

            bookInfo = new BookInfo("도서1", "000-001", "저자1", 40000);
            _bookInfoDictionary.Add(bookInfo.ISBN, bookInfo);
            bookInfo = new BookInfo("도서2", "000-002", "저자2", 42000);
            _bookInfoDictionary.Add(bookInfo.ISBN, bookInfo);
            bookInfo = new BookInfo("도서3", "000-003", "저자3", 53000);
            _bookInfoDictionary.Add(bookInfo.ISBN, bookInfo);
            bookInfo = new BookInfo("도서4", "000-004", "저자1", 37000);
            _bookInfoDictionary.Add(bookInfo.ISBN, bookInfo);
            bookInfo = new BookInfo("도서5", "000-005", "저자2", 18000);
            _bookInfoDictionary.Add(bookInfo.ISBN, bookInfo);
            bookInfo = new BookInfo("도서6", "000-006", "저자3", 20000);
            _bookInfoDictionary.Add(bookInfo.ISBN, bookInfo);
            bookInfo = new BookInfo(null   , "000-007", null   , 20000);
            _bookInfoDictionary.Add(bookInfo.ISBN, bookInfo);
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 도서 정보 구하기 - GetBookInfo(isbn)

        /// <summary>
        /// 도서 정보 구하기
        /// </summary>
        /// <param name="isbn">ISBN</param>
        /// <returns>도서 정보</returns>
        public BookInfo GetBookInfo(string isbn)
        {
            if(_bookInfoDictionary.ContainsKey(isbn))
            {
                return _bookInfoDictionary[isbn];
            }
            else
            {
                return null;
            }
        }

        #endregion
    }
}

 

▶ Program.cs (서버)

using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    public class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        private static void Main()
        {
            Console.WriteLine("Serializable 데이터 계약 테스트 서버를 시작합니다...");

            ServiceHost serviceHost = new ServiceHost(typeof(BookStoreService),
                new Uri("http://localhost/wcf/bookstoreservice"));

            serviceHost.AddServiceEndpoint(typeof(IBookStore), new BasicHttpBinding(), string.Empty);


            ServiceMetadataBehavior serviceMetadataBehavior = new ServiceMetadataBehavior();

            serviceMetadataBehavior.HttpGetEnabled = true;

            serviceHost.Description.Behaviors.Add(serviceMetadataBehavior);


            serviceHost.Open();

            Console.WriteLine("서비스 중단을 위해 아무 키나 누르세요...");

            Console.ReadKey(true);

            serviceHost.Close();
        }

        #endregion
    }
}

 

▶ Program.cs (클라이언트)

using System;

using TestProject.BookStore;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    public class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        private static void Main()
        {
            Console.WriteLine("Serializable 데이터 계약 테스트 클라이언트를 시작합니다...");

            using(BookStoreClient bookStoreClient = new BookStoreClient())
            {
                BookInfo info = bookStoreClient.GetBookInfo("000-005");

                Console.WriteLine
                (
                    "도서 정보 :\n    제목={0}\n    저자={1}\n    ISBN={2}\n    가격={3:#,##0}원",
                    info.title,
                    info.Author,
                    info.ISBN,
                    info.Price
                );
            }
        }

        #endregion
    }
}

※ BookStoreClient 클래스는 서비스 참조 추가를 통해 생성한다.

728x90
반응형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요