Ефективне використання 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. Це можна зробити наступною командою:

Ця команда встановить всі необхідні компоненти впроект консольної програми. Після цього додайте в проект посилання на складання System.Web, якщо такого посилання ще немає.

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

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

Настав час додати до нашого додатку REST-сервіс, який буде хоститися на нашому сервері. Для цього додайте новий елемент Web API Controller Class, наприклад, з ім'ям ProductController. Додайте новий клас з ім'ям Product:

У новоствореному контролері ProductController додайте новий метод GetAllProducts:

У зв'язку з тим, що наша програма буде сервером, який слухає певні порти, програма повинна бути запущена з підвищеними привілеями. Ви можете запустити скомпільований виконуваний файл від імені адміністратора самостійно або запустити проект на виконання VS2012 запущеної від імені адміністратора. Іншою можливістю може бути використання Netsh.exe для надання повноважень резервувати URL поточному користувачеві.

Запустіть програму на виконання.

ефективне
Рис.1. Результат звернення до selfhosting-сервісу

Запуск selfhosting-сервісів як сервіс Windows

Для запуску selfhosting-сервісу гарною ідеєю може стати запуск програми-сервера у вигляді сервісу Windows. Зробити це досить легко.

Для швидкого створення системних служб можна використовувати дуже зручний інструмент TopShelf. У консолі пакетного менеджера NuGet виконайте команду інсталяції пакета:

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

Трохи змінимо код нашого проекту. По-перше, винесемо запуск сервера в окремий клас ProductService:

Потім модифікуємо код методу Main для запуску сервісу за допомогою API TopShelf:

Тут за допомогою спеціальних методів, які пропонує TopShelf, ми реєструємо сервіс, задаючи необхідний для запуску клас, його методи старту та припинення роботи, дані опис сервісу та його назву.

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

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

ефективне
Рис.2. Встановлення сервісу Windows

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

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

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

webapi
Мал.4. Запуск служби

Перевіримо роботу selfhosting-сервісу запущеного як сервіс Windows у Fiddler і переконаємось, що все працює.