Узел веб-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 может содержать несколько ролей, хотя в этом руководстве используется одна роль.
Добавление веб-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-адрес можно найти в пользовательском интерфейсе эмулятора вычислений. Щелкните правой кнопкой мыши значок эмулятора в области уведомлений панели задач и выберите Показать пользовательский интерфейс эмулятора вычислений.
Найдите IP-адрес в разделах Развертывания служб, развертывание [id], Сведения о службе. Откройте веб-браузер и перейдите к http:// address/test/1, где address — это IP-адрес, назначенный эмулятором вычислений; например, http://127.0.0.1:80/test/1
. Вы должны увидеть ответ от контроллера веб-API:
Развернуть в Azure
Для этого шага у вас должна быть учетная запись Azure. Если у вас еще нет учетной записи, вы можете создать бесплатную пробную учетную запись всего за несколько минут. Дополнительные сведения см. в статье Бесплатная пробная версия Microsoft Azure.
В Обозреватель решений щелкните правой кнопкой мыши проект AzureApp. Нажмите Публиковать.
Если вы не вошли в учетную запись Azure, щелкните Войти.
После входа выберите подписку и нажмите кнопку Далее.
Введите имя облачной службы и выберите регион. Нажмите кнопку Создать.
Нажмите кнопку Опубликовать.
Настройка имени личного домена для облачной службы Azure (классическая версия)