Хостинг ASP.NET Web API 2 на рабочей роли Azure

Майк Уосон

В этом руководстве показано, как разместить ASP.NET веб-API в рабочей роли Azure с помощью OWIN для самостоятельного размещения платформы веб-API.

Открытый веб-интерфейс для .NET (OWIN) определяет абстракцию между веб-серверами и веб-приложениями .NET. OWIN отделяет веб-приложение от сервера, что делает OWIN идеальным для самостоятельного размещения веб-приложения в собственном процессе за пределами IIS, например внутри рабочей роли Azure.

В этом руководстве вы будете использовать пакет Microsoft.Owin.Host.HttpListener, который предоставляет HTTP-сервер, используемый для самостоятельного размещения приложений OWIN.

Версии программного обеспечения, используемые в руководстве

Создание проекта Microsoft Azure

Запустите Visual Studio с правами администратора. Права администратора необходимы для локальной отладки приложения с помощью эмулятора вычислений Azure.

В меню "Файл" нажмите кнопку "Создать", а затем выберите "Проект". В разделе "Установленные шаблоны" в разделе "Visual C#" щелкните "Облако " и выберите "Облачная служба Windows Azure". Назовите проект "AzureApp" и нажмите кнопку "ОК".

Снимок экрана: диалоговое окно

В диалоговом окне "Новая облачная служба Windows Azure" дважды щелкните рабочую роль. Оставьте имя по умолчанию ("WorkerRole1"). На этом шаге в решение добавляется рабочая роль. Нажмите кнопку ОК.

Снимок экрана: диалоговое окно

Созданное решение Visual Studio содержит два проекта:

  • AzureApp определяет роли и конфигурацию для приложения Azure.
  • WorkerRole1 содержит код для рабочей роли.

Как правило, приложение Azure может содержать несколько ролей, хотя в этом руководстве используется одна роль.

Снимок экрана: окно обозревателя решений с выделением нового проекта приложения Azure и отображением имени приложения и роли под ним.

Добавление веб-API и пакетов OWIN

В меню "Сервис" выберите диспетчер пакетов NuGet, а затем консоль диспетчера пакетов.

В окне консоли диспетчера пакетов введите следующую команду:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

Добавление конечной точки HTTP

В обозревателе решений разверните проект AzureApp. Разверните узел "Роли", щелкните правой кнопкой мыши WorkerRole1 и выберите "Свойства".

Снимок экрана: меню окна обозревателя решений, в котором выделены действия по выбору параметров свойств рабочей роли.

Щелкните "Конечные точки" и нажмите кнопку "Добавить конечную точку".

В раскрывающемся списке "Протокол " выберите "http". В публичном порте и приватном порте введите 80. Эти номера портов могут отличаться. Общедоступный порт — это порт, используемый клиентами для отправки запроса к роли.

Снимок экрана: параметры раскрывающегося меню протокола, в котором показаны различные конфигурации служб и варианты конечной точки.

Настройка веб-API для Self-Host

В обозревателе решений щелкните правой кнопкой мыши проект 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);
        }
    }
}

Добавление контроллера веб-API

Затем добавьте класс контроллера веб-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

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. В зависимости от параметров брандмауэра может потребоваться разрешить эмулятор через брандмауэр.

Замечание

Если вы получите исключение, как показано ниже, см. эту запись блога для обходного решения. Не удалось загрузить файл или сборку 'Microsoft.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' или одну из зависимостей. Определение манифеста найденной сборки не совпадает со ссылкой на сборку. (Исключение из HRESULT: 0x80131040)"

Эмулятор вычислений назначает локальный IP-адрес конечной точке. Ip-адрес можно найти, просмотрев пользовательский интерфейс эмулятора вычислений. Щелкните правой кнопкой мыши значок эмулятора в области уведомлений панели задач и выберите "Показать пользовательский интерфейс эмулятора вычислений".

Снимок экрана интерфейса пользователя эмулятора вычислений Azure, в котором отображаются меню и сведения об адресе конечной точки IP в параметре

Найдите IP-адрес в разделе «Развертывания сервисов», развертывание [id], Подробности службы. Откройте веб-браузер и перейдите к http:// address/test/1, где ip-адрес , назначенный эмулятором вычислений; например, http://127.0.0.1:80/test/1. Вы увидите ответ контроллера веб-API:

Скриншот окна браузера, показывающий ответ контроллера Web API после ввода IP-адреса, назначенного эмулятором вычислений.

Развертывание в Azure

Для этого шага у вас должна быть учетная запись Azure. Если у вас еще нет учетной записи, вы можете создать бесплатную пробную учетную запись всего за несколько минут. Дополнительные сведения см. в бесплатной пробной версии Microsoft Azure.

В обозревателе решений щелкните правой кнопкой мыши проект AzureApp. Выберите Опубликовать.

Снимок экрана: параметры меню обозревателя решений, в котором выделены шаги, которые необходимо выполнить для развертывания или публикации проекта.

Если вы не вошли в учетную запись Azure, нажмите кнопку "Войти".

Снимок экрана: диалоговое окно

После входа выберите подписку и нажмите кнопку "Далее".

Снимок экрана:

Введите имя облачной службы и выберите регион. Нажмите кнопку Создать.

Снимок экрана: диалоговое окно

Нажмите кнопку Опубликовать.

Снимок экрана: окно

Настройка имени личного домена для облачной службы Azure (классическая модель)

Дополнительные ресурсы