Гикам про технологии Microsoft





Компания Microsoft делает следующий важный шаг в развитии своего облачного предложения для российских заказчиков и объявляет о расширении возможностей приобретения сервисов Windows Azure в России, а так же продвигает технологии Windows 10, Office 365, Cortana.

Главная :: Azure


Облачные сервисы и технологии Windows Azure, SQL Azure, AppFabric и другие





Эффективное использование WebAPI: self hosting REST-сервисов

С выходом ASP.NET WebAPI у разработчиков появилась возможность быстро создавать REST-сервисы в удобном виде, с одной стороны полностью реализуя принципы REST,а с другой используя всю мощь платформы ASP.NET.

Про возможности и применение WebAPI написано уже достаточно много статей, например, вы можете узнать о интересной функции самодокументирования API сервиса через ApiExplorer.

Существует еще одна замечательная возможность WebAPI, про которую написано не так много - это возможность WebAPI осуществлять самостоятельный хостинг сервиса (self hosting). В этой статье на примере разбирается, как создавать и запускать REST selfhosting-сервисы на базе WebAPI.

Self hosting REST-сервиса

Для предоставления доступа к API сервиса не всегда является целесообразным разворачивать его на базе сервера IIS. Если сервис не является частью какого-либо веб-приложения, имеет смысл запускать его на базе собственной инфраструктуры.

Другим вариантом использования механизма self hosting может быть запуск сервисов на платформах, которые не содержат сервер IIS либо на которых запуск IIS осложнен или излишен.

Так или иначе, WebAPI позволяет вам создавать сервисы независимые от IIS, доступ к которым может быть получен без установки веб-приложения на веб-сервер .

 

Сервис внутри консольного приложения

Рассмотрим функцию самостоятельного хостинга на простейшем примере консольного приложения. Создайте в Visual Studio 2012 консольное приложение на базе шаблона для языка C#.

С помощью консоли пакетного менеджера NuGet установите пакет AspNetWebApi.Selfhost. Это можно проделать следующей командой:

Цитата

Install-package AspNetWebApi.Selfhost

Данная команда установит все необходимые компоненты в проект консольного приложения. После этого добавьте в проект ссылку на сборку System.Web, если такой ссылки еще нет.

Первым шагом для создания selfhosting-сервиса будет его конфигурирование. За конфигурирование отвечает класс HttpSelfHostConfiguration. Ниже пример конфигурирования сервиса:

var selfHostConfiguraiton = new HttpSelfHostConfiguration("http://localhost:5555");

selfHostConfiguraiton.Routes.MapHttpRoute(
name: "DefaultApiRoute",
routeTemplate: "api/{controller}",
defaults: null
);

Первая строка создает экземпляр класса сервера с установленным адресом. Вторая строка конфигурирует механизм маршрутизации сервера для того, чтобы мы могли запускать на нем свои REST API.

Следующим шагом будет запуск сервера, это достигается с помощью другого класса HttpSelfHostServer. Ниже код, который запускает сервер для selfhosting -сервисов:

using (var server = new HttpSelfHostServer(selfHostConfiguraiton))
{
server.OpenAsync().Wait();
Console.ReadLine();
}

Пришло время добавить в наше приложение REST-сервис, который будет хоститься на нашем сервере. Для этого добавьте в проект новый элемент Web API Controller Class, например, с именем ProductController. Добавьте в проект новый класс с именем Product:

public class Product
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}

В только что созданном контроллере ProductController добавьте новый метод GetAllProducts:

public IList<Product> GetAllProducts()
{
return new List<Product>(){
new Product(){ID = 1, Name="Product 1", Description="Desc 1"},
new Product(){ID = 2, Name="Product 2", Description="Desc 2"},
new Product(){ID = 3, Name="Product 3", Description="Desc 3"},
};
}

Для того чтобы избежать конфликтов, вам нужно будет удалить или закомментировать сгенерированный в шаблоне метод Get().

В связи с тем, что наше приложение будет представлять собой сервер, слушающий определенные порты, приложение должно быть запущено с повышенными привилегиями. Вы можете запустить скомпилированный исполняемый файл от имени администратора самостоятельно либо запустить проект на исполнение в VS2012 запущенной от имени администратора. Другой возможностью может быть использование команды Netsh.exe для предоставления полномочий резервировать URL текущему пользователю.

Запустите приложение на исполнение.

Теперь, пока запущено наше приложение мы можем обращаться к selfhosting-сервису, который запушен без использования IIS. Просто перейдите по адресу http://localhost:5555/api/product/. Для тестирования можно воспользоваться браузером либо использовать Fiddler (рисунок 1).

clip_image001
Рис.1. Результат обращения к selfhosting-сервису

Запуск selfhosting-сервисов в качестве сервиса Windows

Для запуска selfhosting-сервиса хорошей идеей может стать запуск приложения-сервера в виде сервиса Windows. Сделать это достаточно просто.

Для быстрого создания системных служб может использоваться очень удобный инструмент TopShelf. В консоли пакетного менеджера NuGet выполните команду установки пакета:

Цитата

install-package topshelf

После установки пакета вы получите доступ к API, который позволит вам упрощенно создать из своего приложения службу Windows.

Немного изменим код нашего проекта. Во-первых, вынесем запуск сервера в отдельный класс ProductService:

class ProductService
{
private readonly HttpSelfHostServer server;

public ProductService()
{
var selfHostConfiguraiton = new HttpSelfHostConfiguration("http://127.0.0.1:5555");

selfHostConfiguraiton.Routes.MapHttpRoute(
name: "DefaultApiRoute",
routeTemplate: "api/{controller}",
defaults: null
);

server = new HttpSelfHostServer(selfHostConfiguraiton);
}

public void Start()
{
server.OpenAsync();
}

public void Stop()
{
server.CloseAsync();
server.Dispose();
}

}

Затем модифицируем код метода Main для запуска сервиса с помощью API TopShelf:

static void Main(string[] args)
{
HostFactory.Run(x =>
{
x.Service<ProductService>(s =>
{
s.SetServiceName("ProductService Example");
s.ConstructUsing(name => new ProductService());
s.WhenStarted(svc => svc.Start());
s.WhenStopped(svc => svc.Stop());
});

x.RunAsLocalSystem();
x.SetDescription("ProductService WebAPI selfhosting Windows Service Example");
x.SetDisplayName("ProductService Example");
x.SetServiceName("ProductService");
});
}

Здесь с помощью специальных методов, которые предлагает TopShelf мы регистрируем сервис, задавая необходимый для запуска класс, его методы старта и прекращения работы, данные описание сервиса и его название.

После необходимых модификаций скомпилируйте проект. Теперь вы можете запустить свое приложение в виде сервиса Windows, это делается с помощью команды:

Цитата

WebApiSelfhosting install

Сервис будет установлен (рисунок 2).

clip_image002
Рис.2. Установка сервиса Windows

Теперь, если вы перейдете в список системных служб Windows вы без труда обнаружите свое приложение (рисунок 3).

clip_image003

Рис.3. Служба в списке системных служб

Вам может потребоваться запустить ваш сервис, если он не запущен (рисунок 4)

clip_image004
Рис.4. Запуск службы

Проверим работу selfhosting-сервиса запущенного в качестве сервиса Windows в Fiddler и убедимся, что все работает.

Удалить сервис из системы можно командой:

Цитата

WebApiSelfhosting uninstall

Заключение

В этой статье мы рассмотрели одну из функциональных возможностей ASP.NET WebAPI. С помощью механизма self hosting, который поддерживается в WebAPI вы можете создавать REST-сервисы, которые не требуют для своего запуска сервера IIS и могут быть запущены в том окружении, в котором вы захотите.

ASP.NET WebAPI – это новый инструмент, доступный разработчикам в Visual Studio 2012. Вы можете загрузить новую версию Visual Studio 2012 RC по специальному короткому адресу: http://vs2012,ru/.