다음을 통해 공유


Azure 작업자 역할에서 호스트 ASP.NET Web API 2

작성자: Mike Wasson

이 자습서에서는 OWIN을 사용하여 Web API 프레임워크를 자체 호스팅하는 Azure 작업자 역할에서 ASP.NET Web API 호스트하는 방법을 보여 줍니다.

OWIN(Open Web Interface for .NET)은 .NET 웹 서버와 웹 애플리케이션 간의 추상화 를 정의합니다. OWIN은 서버에서 웹 애플리케이션을 분리하므로 OWIN은 IIS 외부에서(예: Azure 작업자 역할 내부) 자체 프로세스에서 웹 애플리케이션을 자체 호스팅하는 데 적합합니다.

이 자습서에서는 OWIN 애플리케이션을 자체 호스팅하는 데 사용되는 HTTP 서버를 제공하는 Microsoft.Owin.Host.HttpListener 패키지를 사용합니다.

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

Microsoft Azure 프로젝트 만들기

관리자 권한으로 Visual Studio를 시작합니다. Azure Compute Emulator를 사용하여 애플리케이션을 로컬로 디버그하려면 관리자 권한이 필요합니다.

파일 메뉴에서 새로 만들기를 클릭한 다음 프로젝트를 클릭합니다. 설치된 템플릿의 Visual C#에서 클라우드를 클릭한 다음 Windows Azure Cloud Service를 클릭합니다. 프로젝트 이름을 "AzureApp"으로 지정하고 확인을 클릭합니다.

Azure 앱 프로젝트를 만들기 위한 메뉴 옵션의 단계를 강조 표시하는 '새 프로젝트' 대화 상자의 스크린샷

새 Windows Azure Cloud Service 대화 상자에서 작업자 역할을 두 번 클릭합니다. 기본 이름("WorkerRole1")을 그대로 둡니다. 이 단계에서는 솔루션에 작업자 역할을 추가합니다. 확인을 클릭합니다.

작업자 역할을 만드는 메뉴 옵션을 보여 주는 '새 Windows Azure Cloud Service' 대화 상자의 스크린샷

만들어진 Visual Studio 솔루션에는 다음 두 개의 프로젝트가 포함됩니다.

  • "AzureApp"은 Azure 애플리케이션에 대한 역할 및 구성을 정의합니다.
  • "WorkerRole1"에는 작업자 역할에 대한 코드가 포함되어 있습니다.

일반적으로 이 자습서에서는 단일 역할을 사용하지만 Azure 애플리케이션에는 여러 역할이 포함될 수 있습니다.

새 Azure 앱 프로젝트를 강조 표시하고 그 아래에 앱 이름 및 작업자 역할 옵션을 보여 주는 솔루션 탐색기 창의 스크린샷

Web API 및 OWIN 패키지 추가

도구 메뉴에서 NuGet 패키지 관리자를 클릭한 다음 패키지 관리자 콘솔을 클릭합니다.

패키지 관리자 콘솔 창에서 다음 명령을 입력합니다.

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

HTTP 엔드포인트 추가

솔루션 탐색기 AzureApp 프로젝트를 확장합니다. 역할 노드를 확장하고 WorkerRole1을 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다.

작업자 역할의 속성 설정을 선택하는 단계를 강조 표시하는 솔루션 탐색기 창 메뉴의 스크린샷

엔드포인트를 클릭한 다음, 엔드포인트 추가를 클릭합니다.

프로토콜 드롭다운 목록에서 "http"를 선택합니다. 공용 포트프라이빗 포트에서 80을 입력합니다. 이러한 포트 번호는 다를 수 있습니다. 퍼블릭 포트는 클라이언트가 역할에 요청을 보낼 때 사용하는 포트입니다.

다양한 서비스 구성 및 엔드포인트 선택을 보여 주는 프로토콜 드롭다운 메뉴 옵션의 스크린샷.

Self-Host 대한 Web API 구성

솔루션 탐색기 WorkerRole1 프로젝트를 마우스 오른쪽 단추로 클릭하고클래스추가 / 를 선택하여 새 클래스를 추가합니다. 클래스 Startup 이름을 지정합니다.

메뉴 옵션을 보여 주는 솔루션 탐색기 창의 스크린샷과 클래스 추가 경로를 강조 표시합니다.

이 파일의 모든 상용구 코드를 다음으로 바꿉 있습니다.

using Owin;
using System.Web.Http;

namespace WorkerRole1
{
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                "Default",
                "{controller}/{id}",
                new { id = RouteParameter.Optional });

            app.UseWebApi(config);
        }
    }
}

Web API 컨트롤러 추가

다음으로 Web API 컨트롤러 클래스를 추가합니다. WorkerRole1 프로젝트를 마우스 오른쪽 단추로 클릭하고클래스추가 / 를 선택합니다. 클래스 이름을 TestController로 지정합니다. 이 파일의 모든 상용구 코드를 다음으로 바꿉 있습니다.

using System;
using System.Net.Http;
using System.Web.Http;

namespace WorkerRole1
{
    public class TestController : ApiController
    {
        public HttpResponseMessage Get()
        {
            return new HttpResponseMessage()
            {
                Content = new StringContent("Hello from OWIN!")
            };
        }

        public HttpResponseMessage Get(int id)
        {
            string msg = String.Format("Hello from OWIN (id = {0})", id);
            return new HttpResponseMessage()
            {
                Content = new StringContent(msg)
            };
        }
    }
}

간단히 하기 위해 이 컨트롤러는 일반 텍스트를 반환하는 두 개의 GET 메서드만 정의합니다.

OWIN 호스트 시작

WorkerRole.cs 파일을 엽니다. 이 클래스는 작업자 역할이 시작되고 중지될 때 실행되는 코드를 정의합니다.

다음 using 문을 추가합니다.

using Microsoft.Owin.Hosting;

클래스에 IDisposable 멤버를 WorkerRole 추가합니다.

public class WorkerRole : RoleEntryPoint
{
    private IDisposable _app = null;

    // ....
}

메서드에서 OnStart 다음 코드를 추가하여 호스트를 시작합니다.

public override bool OnStart()
{
    ServicePointManager.DefaultConnectionLimit = 12;

    // New code:
    var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
    string baseUri = String.Format("{0}://{1}", 
        endpoint.Protocol, endpoint.IPEndpoint);

    Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), 
        "Information");

    _app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
    return base.OnStart();
}

WebApp.Start 메서드는 OWIN 호스트를 시작합니다. 클래스의 Startup 이름은 메서드에 대한 형식 매개 변수입니다. 규칙에 따라 호스트는 이 클래스의 메서드를 Configure 호출합니다.

를 재정 OnStop 의하여 _app instance 삭제합니다.

public override void OnStop()
{
    if (_app != null)
    {
        _app.Dispose();
    }
    base.OnStop();
}

WorkerRole.cs에 대한 전체 코드는 다음과 같습니다.

using Microsoft.Owin.Hosting;
using Microsoft.WindowsAzure.ServiceRuntime;
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;

namespace WorkerRole1
{
    public class WorkerRole : RoleEntryPoint
    {
        private IDisposable _app = null;

        public override void Run()
        {
            Trace.TraceInformation("WebApiRole entry point called", "Information");

            while (true)
            {
                Thread.Sleep(10000);
                Trace.TraceInformation("Working", "Information");
            }
        }

        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;

            var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
            string baseUri = String.Format("{0}://{1}", 
                endpoint.Protocol, endpoint.IPEndpoint);

            Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), 
                "Information");

            _app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
           return base.OnStart();
        }

        public override void OnStop()
        {
            if (_app != null)
            {
                _app.Dispose();
            }
            base.OnStop();
        }
    }
}

솔루션을 빌드하고 F5 키를 눌러 Azure Compute Emulator에서 애플리케이션을 로컬로 실행합니다. 방화벽 설정에 따라 방화벽을 통해 에뮬레이터를 허용해야 할 수 있습니다.

참고

다음과 같은 예외가 발생하면 해결 방법은 이 블로그 게시물을 참조하세요. "파일 또는 어셈블리 'Microsoft.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 해당 종속성 중 하나를 로드할 수 없습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT에서 예외: 0x80131040)"

컴퓨팅 에뮬레이터는 엔드포인트에 로컬 IP 주소를 할당합니다. 컴퓨팅 에뮬레이터 UI를 확인하여 IP 주소를 찾을 수 있습니다. 작업 표시줄 알림 영역에서 에뮬레이터 아이콘을 마우스 오른쪽 단추로 클릭하고 컴퓨팅 에뮬레이터 UI 표시를 선택합니다.

'서비스 세부 정보' 옵션을 선택할 때 메뉴 및 IP 엔드포인트 주소 정보를 보여 주는 Azure Compute Emulator U I의 스크린샷

서비스 배포, 배포 [id], 서비스 세부 정보에서 IP 주소를 찾습니다. 웹 브라우저를 열고 http:// address/test/1로 이동합니다. 여기서 주소 는 컴퓨팅 에뮬레이터에서 할당한 IP 주소입니다. 예를 들면 입니다 http://127.0.0.1:80/test/1. Web API 컨트롤러의 응답이 표시됩니다.

컴퓨팅 에뮬레이터에서 할당한 IP 주소를 입력한 후 Web API 컨트롤러 응답을 보여 주는 브라우저 창의 스크린샷.

Azure에 배포

이 단계에서는 Azure 계정이 있어야 합니다. 아직 없는 경우 몇 분 만에 평가판 계정을 만들 수 있습니다. 자세한 내용은 Microsoft Azure 평가판을 참조하세요.

솔루션 탐색기 AzureApp 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 게시를 선택합니다.

프로젝트를 배포하거나 게시하기 위해 수행할 단계를 강조 표시하는 솔루션 탐색기 창의 메뉴 옵션 스크린샷

Azure 계정에 로그인하지 않은 경우 로그인을 클릭합니다.

다른 옵션을 사용할 수 있게 되기 전에 로그인 옵션을 요청하는 'Azure 애플리케이션 게시' 대화 상자의 스크린샷

로그인한 후 구독을 선택하고 다음을 클릭합니다.

다음 단계를 계속하기 전에 사용자에게 구독 유형을 선택하라는 메시지를 표시하는 로그인 후 'Azure 애플리케이션 게시'의 스크린샷

클라우드 서비스의 이름을 입력하고 지역을 선택합니다. 만들기를 클릭합니다.

사용자에게 애플리케이션 서비스의 이름과 지역을 입력하도록 요청하는 '클라우드 서비스 및 스토리지 계정 만들기' 대화 상자의 스크린샷

게시를 클릭합니다.

'Azure 애플리케이션 게시' 창의 스크린샷, 선택한 모든 설정을 확인하고 뒤로 이동하거나 게시할 단추 옵션을 제공합니다.

Azure 클라우드 서비스(클래식)에 대한 사용자 지정 도메인 이름 구성

추가 리소스