OWIN을 이용한 ASP.NET Web API 자체 호스트(Self-Host)

등록일시: 2014-01-17 08:00,  수정일시: 2015-07-25 13:43
조회수: 10,629
이 문서는 ASP.NET Web API 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

역주: 본 자습서는 다른 문서들에 비해 '많이' 불친절한 편입니다. IIS.netASP.net의 기술문서들을 살펴보면, 전반적으로 작성자 개인의 성향에 따라 문서의 구성 및 분량, 친절도 등이 심하게 좌우되는 편인데, 본문은 그 정도가 조금 더하네요. 가령 자체-호스트 관련 자습서의 예제들은, 대부분 서버와 클라이언트를 별도의 프로젝트로 분리하는 경우가 많은데, 본문에서는 별다른 설명도 없이 한 코드 블럭 안에 모든 것을 구현하고 있습니다. 사전지식이 없는 분들은 이해하기도 어려울 정도입니다.

그럼에도 불구하고 근래에 마이크로소프트의 기술문서에 OWIN과 자체-호스트(Self-Host)라는 단어가 제법 많이 등장하는 추세라고 생각되어 관련된 문서들을 함께 소개하는 자리를 마련하고 싶었습니다. 따라서, 본문을 읽어보실 때는 본문의 구 버전이라고도 말할 수 있는 자체-호스트(Self-Host) Web API (C#) 문서를 먼저 읽어보시고, SignalR 2.0의 자체-호스트를 다루고 있는 ASP.NET SignalR 2.0: 자습서: SignalR 자체-호스트(Self-Host) 문서도 함께 읽어보실 것을 권해드립니다.

본 자습서에서는 OWIN을 이용해서 Web API 프레임워크를 자체-호스트하여, ASP.NET Web API를 콘솔 응용 프로그램에서 호스트하는 방법을 살펴봅니다.

Open Web Interface for .NET (OWIN)은 .NET 웹 서버와 웹 응용 프로그램 간의 추상적 개념들을 정의합니다. OWIN은 웹 응용 프로그램을 서버와 분리시켜주기 때문에, IIS 대신 여러분이 원하는 별도의 프로세스에서 웹 응용 프로그램을 자체-호스트하고자 할 때 안성맞춤입니다.

본 자습서에서는 Microsoft.Owin.Host.HttpListener 패키지를 사용해보게 될 텐데, 이 패키지는 OWIN 응용 프로그램을 자체 호스트하기 위한 용도로 사용할 수 있는 HTTP 서버를 제공해줍니다.

본 자습서의 완전한 샘플 코드는 aspnet.codeplex.com에서 다운로드 받을 수 있습니다.

전제조건

Visual Studio 2012나 Visual Studio 2013이 필요합니다.

콘솔 응용 프로그램 생성하기

먼저, Visual Studio 2013의 파일(File) 메뉴에서 새로 만들기(New) 하위의 프로젝트(Project)를 선택합니다. 새 프로젝트(New Project) 대화 상자가 나타나면 설치됨(Installed), 템플릿(Templates), Visual C# 노드를 차례대로 확장하고 Windows 노드를 선택한 다음, 콘솔 응용 프로그램(Console Application)을 선택합니다. 프로젝트의 이름을 "OwinSelfhostSample"로 지정하고 확인(OK) 버튼을 클릭합니다.

Web API 및 OWIN 패키지 추가하기

도구(Tools) 메뉴에서 라이브러리 패키지 관리(Library Package Manager) 하위의 패키지 관리자 콘솔(Package Manager Console)를 선택합니다. 그리고, 패키지 관리자 콘솔 창에 다음 명령어를 입력합니다:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

그러면, WebAPI OWIN 자체 호스트 패키지와 필요한 모든 OWIN 패키지들이 설치됩니다.

자체-호스트를 위한 Web API 구성

이번에는 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭한 다음, 추가(Add), 클래스...(Class...) 메뉴를 선택합니다. 그리고, 클래스의 이름을 Startup으로 지정합니다.

방금 생성한 클래스의 코드를 다음과 같이 변경합니다:

using Owin;
using System.Web.Http;

namespace OwinSelfhostSample
{
    public class Startup
    {
        // This code configures Web API. The Startup class is specified as a type
        // parameter in the WebApp.Start method.
        public void Configuration(IAppBuilder appBuilder)
        {
            // Configure Web API for self-host. 
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            appBuilder.UseWebApi(config);
        }
    }
}

Web API 컨트롤러 추가하기

이번에는 Web API 컨트롤러 클래스를 추가해보겠습니다. 마우스 오른쪽 버튼으로 프로젝트를 클릭하고 추가(Add), 클래스...(Class...) 메뉴를 선택해서 새로운 클래스를 추가합니다. 클래스 이름은 ValuesController라고 지정합니다.

방금 생성한 클래스의 코드를 다음과 같이 변경합니다:

using System.Collections.Generic;
using System.Web.Http;

namespace OwinSelfhostSample
{
    public class ValuesController : ApiController
    {
        // GET api/values 
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5 
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values 
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5 
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5 
        public void Delete(int id)
        {
        }
    }
}

OWIN 호스트 시작 및 HttpClient를 이용한 요청 만들기

자동으로 생성된 Program.cs 파일의 코드를 다음과 같이 변경합니다:

using Microsoft.Owin.Hosting;
using System;
using System.Net.Http;

namespace OwinSelfhostSample
{
    public class Program
    {
        static void Main()
        {
            string baseAddress = "http://localhost:9000/";

            // Start OWIN host 
            using (WebApp.Start<Startup>(url: baseAddress))
            {
                // Create HttpCient and make a request to api/values 
                HttpClient client = new HttpClient();

                var response = client.GetAsync(baseAddress + "api/values").Result;

                Console.WriteLine(response);
                Console.WriteLine(response.Content.ReadAsStringAsync().Result);
            }

            Console.ReadLine();
        }
    }
}

응용 프로그램 시작하기

마지막으로 Visual Studio에서 F5키를 눌러서 응용 프로그램을 시작합니다. 그러면, 다음과 같은 결과가 출력될 것입니다:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Date: Tue, 09 Jul 2013 18:10:15 GMT
  Server: Microsoft-HTTPAPI/2.0
  Content-Length: 19
  Content-Type: application/json; charset=utf-8
}
["value1","value2"]

추가 리소스