Owin selfhost asp.net Web API отказаться от подключения при запуске в качестве службы

У меня есть работающий веб-сервис API, который я начинаю с консольного проекта. Теперь я хочу, чтобы он работал как сервис.

Я устанавливаю его как службу, используя installutil.exe с этим кодом:

[RunInstaller(true)]
 public    class ApplicationInstaller:Installer
{
    private ServiceProcessInstaller processInstaller;
    private ServiceInstaller serviceInstaller;

    public ApplicationInstaller()
    {

        serviceInstaller = new ServiceInstaller();
        processInstaller = new ServiceProcessInstaller();
        processInstaller.Account = ServiceAccount.LocalSystem;

        serviceInstaller.StartType = ServiceStartMode.Automatic;
        serviceInstaller.ServiceName = "WTT Rumsa";
        serviceInstaller.Description = "Web API for WTT Rumsa";

        Installers.Add(serviceInstaller);
        Installers.Add(processInstaller);


    }



}

Вот что я использую для запуска сервиса:

     public static void StartService()
    {
        var startOptions = new StartOptions();
        var internalURL = $"http://{Environment.MachineName}:6666";
        startOptions.Urls.Add(internalURL);
        _logger.Debug($"Service started at: {internalURL}");

        startOptions.Urls.Add("http://localhost:6666");


        foreach(var address in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
        {
            if(address.AddressFamily==AddressFamily.InterNetwork)
            {
                var ipURL = $"http://{address.ToString()}:6666";

                _logger.Debug($"Service started at: {ipURL}");

                startOptions.Urls.Add(ipURL);


            }
        }

        using(WebApp.Start<SelfHostConfiguration>(startOptions))
        {
            Console.WriteLine($"Service started and listening at {internalURL}");
            Console.ReadLine();
        }
    }

Когда я запускаю сервис, мой регистратор показывает, что он работает через StartService(). Я вижу, что я добавил IP, который я звоню в мой клиент. Сервис не останавливается после того, как я его запустил.

Однако, когда я соединяюсь, я получаю это сообщение: "Невозможно установить соединение, потому что целевой компьютер активно отказался от него"

Так как тип учетной записи - ServiceAccount.LocalSystem и он действительно запускается (и не генерирует исключение), привилегии должны быть в порядке. Я добавил исключение в мой локальный брандмауэр для порта, который я использую.

Что еще может быть не так?

Редактировать: Запустить netstat -ano в командном окне, когда веб-служба работает как консоль и служба, и когда она запускается как служба, она не отображается в списке, а при запуске как консольное приложение -. Проблема с настройкой брандмауэра?

2 ответа

Хорошо. Я нашел решение (или проблемы) Прежде всего: при запуске консольного приложения в качестве службы компилятор пропускает Console.WriteLine и Console.ReadLine (я думаю, что весь тип консоли просто игнорируется)

Это означает, что программа выйдет из моего оператора using:

    using(WebApp.Start<SelfHostConfiguration>(startOptions))
    {
        Console.WriteLine($"Service started and listening at {internalURL}");
        Console.ReadLine();
    }

И это, очевидно, плохо, так как сервер расположен. Что затрудняло отладку, так это то, что служба не закрывалась, пока не остановилась, даже без Console.ReadLine. Если бы это было обычное консольное приложение, оно бы вышло. Таким образом, решение было просто запустить сервис, как это:

_webapp = WebApp.Start<SelfHostConfiguration>("http://+:8080");

Вам нужно использовать ServiceBase.Run(...) и реализовать класс ServiceBase. ServiceBase.Run(...) является блокирующим вызовом до тех пор, пока не получит остановку от узла службы Windows. Пример тут.

Другие вопросы по тегам