Pull to refresh
0
Microsoft
Microsoft — мировой лидер в области ПО и ИТ-услуг

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

Reading time 5 min
Views 43K
С выходом 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/.

Исходные коды финального проекта (со всеми пакетами и бинарными компонентами) доступны по ссылке sdrv.ms/K9F7Hs
Tags:
Hubs:
+7
Comments 36
Comments Comments 36

Articles

Information

Website
www.microsoft.com
Registered
Founded
Employees
Unknown
Location
США