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