Azure 작업자 역할의 호스트 ASP.NET Web API 2Host ASP.NET Web API 2 in an Azure Worker Role

Mike Wassonby Mike Wasson

이 자습서에서는 OWIN를 사용 하 여 Web API 프레임 워크를 자체 호스트 하는 Azure 작업자 역할의 ASP.NET Web API를 호스트 하는 방법을 보여 줍니다.This tutorial shows how to host ASP.NET Web API in an Azure Worker Role, using OWIN to self-host the Web API framework.

OWIN ( Open Web Interface for .net )는 .net 웹 서버와 웹 응용 프로그램 간의 추상화를 정의 합니다.Open Web Interface for .NET (OWIN) defines an abstraction between .NET web servers and web applications. OWIN는 서버에서 웹 응용 프로그램을 분리 하 여 IIS 외부 (예: Azure 작업자 역할 내부)에서 웹 응용 프로그램을 자체 호스트 하는 데 적합 합니다.OWIN decouples the web application from the server, which makes OWIN ideal for self-hosting a web application in your own process, outside of IIS–for example, inside an Azure worker role.

이 자습서에서는 OWIN 응용 프로그램을 자체 호스트 하는 데 사용 되는 HTTP 서버를 제공 하는 Owin HttpListener 패키지를 사용 합니다.In this tutorial, you'll use the Microsoft.Owin.Host.HttpListener package, which provides an HTTP server that be used to self-host OWIN applications.

자습서에서 사용 되는 소프트웨어 버전Software versions used in the tutorial

Microsoft Azure 프로젝트 만들기Create a Microsoft Azure Project

관리자 권한으로 Visual Studio를 시작 합니다.Start Visual Studio with administrator privileges. Azure 계산 에뮬레이터를 사용 하 여 응용 프로그램을 로컬로 디버깅 하려면 관리자 권한이 필요 합니다.Administrator privileges are needed to debug the application locally, using the Azure compute emulator.

파일 메뉴에서 새로 만들기를 클릭 한 다음 프로젝트를 클릭 합니다.On the File menu, click New, then click Project. 설치 된 템플릿의 시각적 개체 C#에서 클라우드 를 클릭 한 다음 Windows Azure 클라우드 서비스를 클릭 합니다.From Installed Templates, under Visual C#, click Cloud and then click Windows Azure Cloud Service. 프로젝트 이름을 "AzureApp"으로 선택 하 고 확인을 클릭 합니다.Name the project "AzureApp" and click OK.

새 Windows Azure 클라우드 서비스 대화 상자에서 작업자 역할을 두 번 클릭 합니다.In the New Windows Azure Cloud Service dialog, double-click Worker Role. 기본 이름 ("WorkerRole1")을 그대로 둡니다.Leave the default name ("WorkerRole1"). 이 단계에서는 솔루션에 작업자 역할을 추가 합니다.This step adds a worker role to the solution. 확인을 클릭합니다.Click OK.

생성 되는 Visual Studio 솔루션에는 두 개의 프로젝트가 포함 됩니다.The Visual Studio solution that is created contains two projects:

  • "AzureApp"는 Azure 응용 프로그램에 대 한 역할 및 구성을 정의 합니다."AzureApp" defines the roles and configuration for the Azure application.
  • "WorkerRole1"에는 작업자 역할에 대 한 코드가 포함 되어 있습니다."WorkerRole1" contains the code for the worker role.

일반적으로이 자습서에서는 단일 역할을 사용 하지만 Azure 응용 프로그램에는 여러 역할이 포함 될 수 있습니다.In general, an Azure application can contain multiple roles, although this tutorial uses a single role.

Web API 및 OWIN 패키지 추가Add the Web API and OWIN Packages

도구 메뉴에서 NuGet 패키지 관리자를 클릭 한 다음 패키지 관리자 콘솔을 클릭 합니다.From the Tools menu, click NuGet Package Manager, then click Package Manager Console.

패키지 관리자 콘솔 창에서 다음 명령을 입력합니다.In the Package Manager Console window, enter the following command:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

HTTP 끝점 추가Add an HTTP Endpoint

솔루션 탐색기에서 AzureApp 프로젝트를 확장 합니다.In Solution Explorer, expand the AzureApp project. 역할 노드를 확장 하 고 WorkerRole1를 마우스 오른쪽 단추로 클릭 한 다음 속성을 선택 합니다.Expand the Roles node, right-click WorkerRole1, and select Properties.

엔드포인트를 클릭한 다음, 엔드포인트 추가를 클릭합니다.Click Endpoints, and then click Add Endpoint.

프로토콜 드롭다운 목록에서 "http"를 선택 합니다.In the Protocol dropdown list, select "http". 공용 포트개인 포트에 80을 입력 합니다.In Public Port and Private Port, type 80. 이러한 포트 번호는 다를 수 있습니다.These port numbers can be different. 공용 포트는 역할에 요청을 보낼 때 클라이언트에서 사용 하는 것입니다.The public port is what clients use when they send a request to the role.

자체 호스트에 대 한 Web API 구성Configure Web API for Self-Host

솔루션 탐색기에서 WorkerRole1 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 / 클래스 추가 를 선택 하 여 새 클래스를 추가 합니다.In Solution Explorer, right click the WorkerRole1 project and select Add / Class to add a new class. 클래스 Startup 이름을 지정합니다.Name the class Startup.

이 파일의 모든 상용구 코드를 다음으로 바꿉니다.Replace all of the boilerplate code in this file with the following:

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 컨트롤러 추가Add a Web API Controller

그런 다음 웹 API 컨트롤러 클래스를 추가 합니다.Next, add a Web API controller class. WorkerRole1 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 / 클래스 추가 를 선택 합니다.Right-click the WorkerRole1 project and select Add / Class. TestController 클래스의 이름을로 합니다.Name the class TestController. 이 파일의 모든 상용구 코드를 다음으로 바꿉니다.Replace all of the boilerplate code in this file with the following:

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 메서드를 정의 합니다.For simplicity, this controller just defines two GET methods that return plain text.

OWIN 호스트 시작Start the OWIN Host

WorkerRole.cs 파일을 엽니다.Open the WorkerRole.cs file. 이 클래스는 작업자 역할이 시작 및 중지 될 때 실행 되는 코드를 정의 합니다.This class defines the code that runs when the worker role is started and stopped.

다음 using 문을 추가합니다.Add the following using statement:

using Microsoft.Owin.Hosting;

WorkerRole 클래스에 IDisposable 멤버를 추가 합니다.Add an IDisposable member to the WorkerRole class:

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

    // ....
}

OnStart 메서드에서 호스트를 시작 하는 다음 코드를 추가 합니다.In the OnStart method, add the following code to start the host:

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 메서드는 OWIN 호스트를 시작 합니다.The WebApp.Start method starts the OWIN host. Startup 클래스의 이름은 메서드의 형식 매개 변수입니다.The name of the Startup class is a type parameter to the method. 규칙에 따라 호스트는이 클래스의 Configure 메서드를 호출 합니다.By convention, the host will call the Configure method of this class.

OnStop를 재정의 하 여 _app instance를 삭제 합니다.Override the OnStop to dispose of the _app instance:

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

WorkerRole.cs에 대 한 전체 코드는 다음과 같습니다.Here is the complete code for 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 계산 에뮬레이터에서 응용 프로그램을 로컬로 실행 합니다.Build the solution, and press F5 to run the application locally in the Azure Compute Emulator. 방화벽 설정에 따라 에뮬레이터를 방화벽을 통해 허용 해야 할 수도 있습니다.Depending on your firewall settings, you might need to allow the emulator through your firewall.

Note

다음과 같은 예외가 발생 하는 경우 해결 방법은 이 블로그 게시물 을 참조 하세요.If you get an exception like the following, please see this blog post for a workaround. "파일 또는 어셈블리 ' Owin, Version = 2.0.2.0, Culture = 중립, PublicKeyToken = 31bf3856ad364e35 ' 또는 해당 종속성 중 하나를 로드할 수 없습니다."Could not load file or assembly 'Microsoft.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치 하지 않습니다.The located assembly's manifest definition does not match the assembly reference. (HRESULT의 예외: 0x80131040) "(Exception from HRESULT: 0x80131040)"

계산 에뮬레이터는 끝점에 로컬 IP 주소를 할당 합니다.The compute emulator assigns a local IP address to the endpoint. 계산 에뮬레이터 UI를 확인 하 여 IP 주소를 찾을 수 있습니다.You can find the IP address by viewing the Compute Emulator UI. 작업 표시줄 알림 영역에서 에뮬레이터 아이콘을 마우스 오른쪽 단추로 클릭 하 고 계산 에뮬레이터 UI 표시를 선택 합니다.Right-click the emulator icon in the task bar notification area, and select Show Compute Emulator UI.

서비스 배포, 배포 [id], 서비스 세부 정보에서 IP 주소를 찾습니다.Find the IP address under Service Deployments, deployment [id], Service Details. 웹 브라우저를 열고 http://address/test/1로 이동 합니다. 여기서 address 는 계산 에뮬레이터에서 할당 한 IP 주소입니다. 예를 들어 http://127.0.0.1:80/test/1합니다.Open a web browser and navigate to http://address/test/1, where address is the IP address assigned by the compute emulator; for example, http://127.0.0.1:80/test/1. 웹 API 컨트롤러에서 응답이 표시 되어야 합니다.You should see the response from the Web API controller:

Deploy to AzureDeploy to Azure

이 단계에서는 Azure 계정이 있어야 합니다.For this step, you must have an Azure account. 아직 없는 경우 몇 분만에 무료 평가판 계정을 만들 수 있습니다.If you don't already have one, you can create a free trial account in just a couple of minutes. 자세한 내용은 Microsoft Azure 무료 평가판을 참조 하세요.For details, see Microsoft Azure Free Trial.

솔루션 탐색기에서 AzureApp 프로젝트를 마우스 오른쪽 단추로 클릭 합니다.In Solution Explorer, right-click the AzureApp project. 게시를 선택합니다.Select Publish.

Azure 계정에 로그인 하지 않은 경우 로그인을 클릭 합니다.If you are not signed in to your Azure account, click Sign In.

로그인 한 후 구독을 선택 하 고 다음을 클릭 합니다.After you are signed in, choose a subscription and click Next.

클라우드 서비스의 이름을 입력 하 고 지역을 선택 합니다.Enter a name for the cloud service and choose a region. 만들기를 클릭합니다.Click Create.

게시를 클릭합니다.Click Publish.

Azure 활동 로그 창에는 배포 진행률이 표시 됩니다.The Azure Activity Log window shows the progress of the deployment. 앱이 배포 되 면 http://appname.cloudapp.net/test/1로 이동 합니다.When the app is deployed, browse to http://appname.cloudapp.net/test/1.

추가 리소스Additional Resources