Azure 작업자 역할에 OWIN 호스트

이 자습서에서는 Microsoft Azure 작업자 역할에서 OWIN을 자체 호스팅하는 방법을 보여 줍니다.

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

이 자습서에서는 Microsoft Azure 작업자 역할 내에서 OWIN 애플리케이션을 자체 호스팅하는 방법을 알아봅니다. 작업자 역할에 대한 자세한 내용은 Azure 실행 모델을 참조하세요.

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

Microsoft Azure 프로젝트 만들기

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

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

예제 파일 구조 이미지

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

Azure 클라우드 서비스 대화 상자

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

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

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

솔루션 탐색기, 대화 상자

OWIN Self-Host 패키지 추가

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

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

Install-Package Microsoft.Owin.SelfHost

HTTP 엔드포인트 추가

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

HTTP 엔드포인트 추가 그림

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

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

프로토콜 선택 예제 이미지

OWIN 시작 클래스 만들기

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

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

using Owin;

namespace WorkerRole1
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseWelcomePage("/");
        }
    }
}

확장 메서드는 UseWelcomePage 사이트가 작동하는지 확인하기 위해 애플리케이션에 간단한 HTML 페이지를 추가합니다.

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("WorkerRole 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에서 애플리케이션을 로컬로 실행합니다. 방화벽 설정에 따라 방화벽을 통해 에뮬레이터를 허용해야 할 수 있습니다.

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

컴퓨팅 에뮬레이터 일러스트레이션

서비스 배포, 배포 [id], 서비스 세부 정보에서 IP 주소를 찾습니다. 웹 브라우저를 열고 http:// address로 이동합니다. 여기서 address 는 컴퓨팅 에뮬레이터에서 할당한 IP 주소입니다. 예를 들면 입니다 http://127.0.0.1:80. OWIN 시작 페이지가 표시됩니다.

IP 주소 찾기 그림

Azure에 배포

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

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

AzureApp 일러스트레이션 게시

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

로그인 예제 이미지

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

구독 이미지 선택 예제

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

클라우드 서비스 만들기, 이미지 예제

게시를 클릭합니다.

새로 만든 Azure 애플리케이션 게시, 이미지 예제

Azure 활동 로그 창에는 배포 진행률이 표시됩니다. 앱이 배포되면 로 이동합니다 http://appname.cloudapp.net/. 여기서 appname 은 클라우드 서비스의 이름입니다.

추가 리소스