Поделиться через


Узел веб-API ASP.NET 2 в рабочей роли Azure

Майк Уассон

В этом руководстве показано, как разместить веб-API ASP.NET в рабочей роли 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-адрес можно найти в пользовательском интерфейсе эмулятора вычислений. Щелкните правой кнопкой мыши значок эмулятора в области уведомлений панели задач и выберите Показать пользовательский интерфейс эмулятора вычислений.

Снимок экрана: U I эмулятора вычислений Azure, где отображаются меню и сведения об адресе конечной точки IP при выборе параметра

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

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

Развернуть в Azure

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

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

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

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

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

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

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

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

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

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

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

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

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