ASP.NET Web API 2 Azure 작업자 역할에서 호스트Host 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.

Open Web Interface for.NET (OWIN).NET 웹 서버 및 웹 응용 프로그램 간의 추상화를 정의 합니다.Open Web Interface for .NET (OWIN) defines an abstraction between .NET web servers and web applications. 이상적인 OWIN 자체 IIS 외부에서 사용자 고유의 프로세스에서 웹 응용 프로그램을 호스팅하는 서버에서 웹 응용 프로그램을 분리 하는 OWIN – 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.

이 자습서에서는 Microsoft.Owin.Host.HttpListener 패키지 자체 OWIN 응용 프로그램을 호스팅하는 데 사용 하는 HTTP 서버를 제공 하는 합니다.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. 설치 된 템플릿, Visual 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.

웹 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.

웹 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);
        }
    }
}

웹 API 컨트롤러 추가Add a Web API Controller

다음으로, Web 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.

다음 추가 문을 사용 하 여:Add the following using statement:

using Microsoft.Owin.Hosting;

추가 된 IDisposable 멤버는 WorkerRole 클래스: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.Start 메서드 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 삭제 하는 _앱 인스턴스: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 Compute 에뮬레이터에서 응용 프로그램을 로컬로 실행 합니다.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. "파일이 나 어셈블리를 로드할 수 없습니다 ' Microsoft.Owin, 버전 2.0.2.0, Culture = neutral, 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. Compute 에뮬레이터 UI를 확인 하 여 IP 주소를 찾을 수 있습니다.You can find the IP address by viewing the Compute Emulator UI. 작업 표시줄 알림 영역에서에서 에뮬레이터 아이콘을 마우스 오른쪽 단추로 누르고 Compute 에뮬레이터 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:// 이동할주소/테스트/1, 여기서 주소 계산 에뮬레이터에서 할당 한 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. Web API 컨트롤러에서 응답이 표시 됩니다.You should see the response from the Web API controller:

Azure에 배포Deploy 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