Как разместить веб-API в Windows Service - PullRequest
3 голосов
/ 20 октября 2011

У меня есть несколько ресурсов, которые я хотел бы раскрыть с помощью веб-API WCF. Я исследовал Web API с помощью веб-хоста, но все наши сервисы работают как Windows Services в производственном процессе, поэтому мне пора отложить тесты и убедиться, что все будет работать так, как нам нужно. Я выглядел как пример приложения здесь: http://webapicontrib.codeplex.com/SourceControl/changeset/view/2d771a4d6f6f#Samples%2fSelfHosted%2fserver%2fProgram.cs, но это не работает с текущей версией (превью 5), потому что класс HttpConfigurableServiceHost недоступен из нашего кода.

Одним из наиболее привлекательных аспектов Web API является простой запуск с использованием MapServiceRoute и новой конфигурации WebApiConfiguration. Однако я не вижу способа определить базовый URL-адрес и порт для служб. Очевидно, что размещение службы в IIS устраняет это, поскольку мы настраиваем эту информацию в IIS. Как я могу сделать это при размещении в службе Windows?

Ответы [ 3 ]

3 голосов
/ 12 июня 2012

Это на самом деле довольно просто. В двух словах вам нужно создать экземпляры HttpSelfHostServer и HttpSelfHostConfiguration, а затем вызвать server.OpenAsync ().

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

public void Stop()
{
    _server.CloseAsync().Wait();
    _server.Dispose();
}

Пример того, как сделать это с помощью шаблона проекта службы Windows и / или библиотеки Topshelf, см. В моем блоге: http://www.piotrwalat.net/hosting-web-api-in-windows-service/

2 голосов
/ 20 октября 2011

Последняя версия просто использует HttpServiceHost.http://webapicontrib.codeplex.com/SourceControl/changeset/view/ddc499585751#Samples%2fSelfHosted%2fserver%2fProgram.cs

Звоните мне в твиттер, если у вас по-прежнему будут проблемы.

1 голос
/ 20 октября 2011

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

static void Main(string[] args)
{
    var host = new HttpServiceHost(typeof(PeopleService), "http://localhost:8080/people");

    host.Open();

    foreach (var ep in host.Description.Endpoints)
    {
        Console.WriteLine("Using {0} at {1}", ep.Binding.Name, ep.Address);
    }

    Console.ReadLine();

    host.Close();
}

См. это сообщение в блоге.

...