Self-Host ASP.NET Web API 1(C#)

작성자: Mike Wasson

이 자습서에서는 콘솔 애플리케이션 내에서 웹 API를 호스트하는 방법을 보여 줍니다. ASP.NET Web API IIS가 필요하지 않습니다. 자체 호스트 프로세스에서 웹 API를 자체 호스팅할 수 있습니다.

새 애플리케이션은 OWIN을 사용하여 Web API를 자체 호스팅해야 합니다. OWIN을 사용하여 Self-Host ASP.NET Web API 2를 참조하세요.

자습서에서 사용되는 소프트웨어 버전

  • Web API 1
  • Visual Studio 2012

콘솔 애플리케이션 프로젝트 만들기

Visual Studio를 시작하고 시작 페이지에서 새 프로젝트를 선택합니다. 또는 파일 메뉴에서 새로 만들기 를 선택한 다음 프로젝트를 선택합니다.

템플릿 창에서 설치된 템플릿을 선택하고 Visual C# 노드를 확장합니다. Visual C#에서 Windows를 선택합니다. 프로젝트 템플릿 목록에서 콘솔 애플리케이션을 선택합니다. 프로젝트 이름을 "SelfHost"로 지정하고 확인을 클릭합니다.

폴더 목록의 Visual C# 항목과 회색으로 강조 표시된 Windows Forms 애플리케이션 항목을 보여 주는 새 프로젝트 대화 상자의 스크린샷

대상 프레임워크 설정(Visual Studio 2010)

Visual Studio 2010을 사용하는 경우 대상 프레임워크를 .NET Framework 4.0으로 변경합니다. (기본적으로 프로젝트 템플릿은 .Net Framework 클라이언트 프로필을 대상으로 합니다.)

솔루션 탐색기 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 대상 프레임워크 드롭다운 목록에서 대상 프레임워크를 .NET Framework 4.0으로 변경합니다. 변경 내용을 적용하라는 메시지가 표시되면 예를 클릭합니다.

파란색으로 강조 표시된 점 NET Framework 4 항목이 있는 대상 프레임워크 드롭다운 목록을 보여 주는 솔루션 탐색기 창의 스크린샷

NuGet 패키지 관리자 설치

NuGet 패키지 관리자는 Web API 어셈블리를 non-ASP.NET 프로젝트에 추가하는 가장 쉬운 방법입니다.

NuGet 패키지 관리자가 설치되어 있는지 검사 Visual Studio의 도구 메뉴를 클릭합니다. NuGet 패키지 관리자라는 메뉴 항목이 표시되면 NuGet 패키지 관리자가 있습니다.

NuGet 패키지 관리자를 설치하려면 다음을 수행합니다.

  1. Visual Studio를 시작합니다.
  2. 도구 메뉴에서 확장 및 업데이트를 선택합니다.
  3. 확장 및 업데이트 대화 상자에서 온라인을 선택합니다.
  4. "NuGet 패키지 관리자"가 표시되지 않으면 검색 상자에 "nuget 패키지 관리자"를 입력합니다.
  5. NuGet 패키지 관리자를 선택하고 다운로드를 클릭합니다.
  6. 다운로드가 완료되면 설치하라는 메시지가 표시됩니다.
  7. 설치가 완료되면 Visual Studio를 다시 시작하라는 메시지가 표시될 수 있습니다.

검색 결과에서 NuGet 패키지 관리자가 회색으로 강조 표시된 확장 및 업데이트 대화 상자의 스크린샷

Web API NuGet 패키지 추가

NuGet 패키지 관리자가 설치되면 Web API Self-Host 패키지를 프로젝트에 추가합니다.

  1. 도구 메뉴에서 NuGet 패키지 관리자를 선택합니다. 참고: 이 메뉴 항목이 표시되지 않으면 NuGet 패키지 관리자가 올바르게 설치되어 있는지 확인합니다.
  2. 솔루션용 NuGet 패키지 관리를 선택합니다.
  3. NugGet 패키지 관리 대화 상자에서 온라인을 선택합니다.
  4. 검색 상자에 "Microsoft.AspNet.WebApi.SelfHost"를 입력합니다.
  5. ASP.NET Web API 자체 호스트 패키지를 선택하고 설치를 클릭합니다.
  6. 패키지가 설치되면 닫기를 클릭하여 대화 상자를 닫습니다.

참고

AspNetWebApi.SelfHost가 아닌 Microsoft.AspNet.WebApi.SelfHost라는 패키지를 설치해야 합니다.

파란색으로 강조 표시된 Microsoft ASP dot Net Web API 자체 호스트를 보여 주는 NuGet 패키지 관리 대화 상자의 스크린샷

모델 및 컨트롤러 만들기

이 자습서에서는 시작 자습서와 동일한 모델 및 컨트롤러 클래스를 사용합니다.

라는 Product공용 클래스를 추가합니다.

namespace SelfHost
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

라는 ProductsController공용 클래스를 추가합니다. System.Web.Http.ApiController에서 이 클래스를 파생합니다.

namespace SelfHost
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Web.Http;
    
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]  
        {  
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },  
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },  
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }  
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public Product GetProductById(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return product;
        }

        public IEnumerable<Product> GetProductsByCategory(string category)
        {
            return products.Where(p => string.Equals(p.Category, category,
                    StringComparison.OrdinalIgnoreCase));
        }
    }
}

이 컨트롤러의 코드에 대한 자세한 내용은 시작 자습서를 참조하세요. 이 컨트롤러는 세 가지 GET 작업을 정의합니다.

URI 설명
/api/products 모든 제품 목록을 가져옵니다.
/api/products/id ID로 제품을 가져옵니다.
/api/products/?category=category 범주별 제품 목록을 가져옵니다.

Web API 호스트

Program.cs 파일을 열고 다음 using 문을 추가합니다.

using System.Web.Http;
using System.Web.Http.SelfHost;

Program 클래스에 다음 코드를 추가합니다.

var config = new HttpSelfHostConfiguration("http://localhost:8080");

config.Routes.MapHttpRoute(
    "API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional });

using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
    server.OpenAsync().Wait();
    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

(선택 사항) HTTP URL 네임스페이스 예약 추가

이 애플리케이션은 을 수신 대기 http://localhost:8080/합니다. 기본적으로 특정 HTTP 주소에서 수신 대기하려면 관리자 권한이 필요합니다. 따라서 자습서를 실행하면 다음 오류가 발생할 수 있습니다. "HTTP에서 URL http://+:8080/"을 등록할 수 없습니다. 이 오류를 방지하는 방법에는 두 가지가 있습니다.

  • 관리자 권한으로 Visual Studio를 실행하거나
  • Netsh.exe 사용하여 계정에 URL을 예약할 수 있는 권한을 부여합니다.

Netsh.exe 사용하려면 관리자 권한으로 명령 프롬프트를 열고 다음 명령을 입력합니다.

netsh http add urlacl url=http://+:8080/ user=machine\username

여기서 machine\username 은 사용자 계정입니다.

자체 호스팅이 완료되면 예약을 삭제해야 합니다.

netsh http delete urlacl url=http://+:8080/

클라이언트 애플리케이션에서 Web API 호출(C#)

웹 API를 호출하는 간단한 콘솔 애플리케이션을 작성해 보겠습니다.

솔루션에 새 콘솔 애플리케이션 프로젝트를 추가합니다.

  • 솔루션 탐색기 솔루션을 마우스 오른쪽 단추로 클릭하고 새 프로젝트 추가를 선택합니다.
  • "ClientApp"이라는 새 콘솔 애플리케이션을 만듭니다.

오른쪽 클릭 메뉴 항목인 추가 및 새 프로젝트가 흰색으로 강조 표시된 솔루션 탐색기 스크린샷

NuGet 패키지 관리자를 사용하여 ASP.NET Web API 핵심 라이브러리 패키지를 추가합니다.

  • 도구 메뉴에서 NuGet 패키지 관리자를 선택합니다.
  • 솔루션용 NuGet 패키지 관리를 선택합니다.
  • NuGet 패키지 관리 대화 상자에서 온라인을 선택합니다.
  • 검색 상자에 "Microsoft.AspNet.WebApi.Client"를 입력합니다.
  • Microsoft ASP.NET Web API 클라이언트 라이브러리 패키지를 선택하고 설치를 클릭합니다.

SelfHost 프로젝트에 ClientApp의 참조를 추가합니다.

  • 솔루션 탐색기 ClientApp 프로젝트를 마우스 오른쪽 단추로 클릭합니다.
  • 참조 추가를 선택합니다.
  • 참조 관리자 대화 상자의 솔루션에서 프로젝트를 선택합니다.
  • SelfHost 프로젝트를 선택합니다.
  • 확인을 클릭합니다.

파란색 상자로 강조 표시된 자체 호스트 프로젝트를 보여 주는 참조 관리자 대화 상자의 스크린샷

Client/Program.cs 파일을 엽니다. 다음 using 문을 추가합니다.

using System.Net.Http;

정적 HttpClient instance 추가합니다.

namespace Client
{
    class Program
    {
        static HttpClient client = new HttpClient();
    }
}

다음 방법을 추가하여 모든 제품을 나열하고, ID별로 제품을 나열하고, 범주별로 제품을 나열합니다.

static void ListAllProducts()
{
    HttpResponseMessage resp = client.GetAsync("api/products").Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var p in products)
    {
        Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
    }
}

static void ListProduct(int id)
{
    var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;
    resp.EnsureSuccessStatusCode();

    var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
    Console.WriteLine("ID {0}: {1}", id, product.Name);
}

static void ListProducts(string category)
{
    Console.WriteLine("Products in '{0}':", category);

    string query = string.Format("api/products?category={0}", category);

    var resp = client.GetAsync(query).Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var product in products)
    {
        Console.WriteLine(product.Name);
    }
}

이러한 각 메서드는 동일한 패턴을 따릅니다.

  1. HttpClient.GetAsync를 호출하여 적절한 URI에 GET 요청을 보냅니다.
  2. HttpResponseMessage.EnsureSuccessStatusCode를 호출합니다. HTTP 응답 상태 오류 코드인 경우 이 메서드는 예외를 throw합니다.
  3. READAsync<T>를 호출하여 HTTP 응답에서 CLR 형식을 역직렬화합니다. 이 메서드는 System.Net.Http.HttpContentExtensions에 정의된 확장 메서드입니다.

GetAsyncReadAsync 메서드는 모두 비동기입니다. 비동기 작업을 나타내는 Task 개체를 반환합니다. Result 속성을 가져오면 작업이 완료될 때까지 스레드가 차단됩니다.

차단이 아닌 호출을 만드는 방법을 포함하여 HttpClient 사용에 대한 자세한 내용은 .NET 클라이언트에서 Web API 호출을 참조하세요.

이러한 메서드를 호출하기 전에 HttpClient instance BaseAddress 속성을 "http://localhost:8080"로 설정합니다. 예:

static void Main(string[] args)
{
    client.BaseAddress = new Uri("http://localhost:8080");

    ListAllProducts();
    ListProduct(1);
    ListProducts("toys");

    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

이렇게 하면 다음이 출력되어야 합니다. (SelfHost 애플리케이션을 먼저 실행해야 합니다.)

1 Tomato Soup 1.0 (Groceries)
2 Yo-yo 3.75 (Toys)
3 Hammer 16.99 (Hardware)
ID 1: Tomato Soup
Products in 'toys':
Yo-yo
Press Enter to quit.

I D 및 범주와 연결된 제품의 출력된 목록을 보여 주는 콘솔 창의 스크린샷.