Самостоятельная служба windows (Консольное приложение работает нормально) на Windows Сервер 2016 RSTful API недоступен - PullRequest
1 голос
/ 24 января 2020

Мой главный вопрос: в чем разница между службой самообслуживания внутри консольного приложения и службой windows?

Я написал консольное приложение Self-Host Web API, которое предоставляет простой API. Для этого я использовал в основном пример MSDN:

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        var config = new HttpConfiguration();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}",
            defaults: new { id = RouteParameter.Optional }
        );
        appBuilder.UseWebApi(config);
    }
}

public class HeartbeatController : ApiController
    {
        public HttpResponseMessage Get()
        {
            var jsonToSend = GetJsonHeartbeatStatus();
            if (!string.IsNullOrEmpty(jsonToSend))
            {
                var response = this.Request.CreateResponse(HttpStatusCode.OK);
                response.Content = new StringContent(jsonToSend, Encoding.UTF8, "application/json");
                return response;
            }
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }

        private string GetJsonHeartbeatStatus()
        {
            var hs = new HeartbeatStatus();
            hs.Toolname = "html Scraper";
            hs.Heartbeat = DateTime.Now.ToString();
            hs.Plant = "plant1";
            hs.Department = "departmentA";
            hs.Servername = Environment.MachineName;
            return JsonConvert.SerializeObject(hs);
        }
    }

protected override void OnStart(string[] args)
        {
            base.OnStart(args);
            logger.Info("In OnStart");

            var UserDomain = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
            var Port = "8377";
            string baseAddress = string.Format("http://{0}.{1}:{2}", Environment.MachineName, UserDomain, Port);

            var completeAddress = baseAddress + "/api/heartbeat";
            try
            {
                host = WebApp.Start<Startup>(baseAddress);
                HttpClient client = new HttpClient();
                var response = client.GetAsync(completeAddress).Result;

                logger.Info("Api address: {0}", completeAddress);
                logger.Info("Service Host started @{0}", DateTime.Now.ToString());
            }
            catch (Exception ex)
            {
                logger.Info("{0}", ex.ToString());
            }
            finally
            {
                if (host != null)
                {
                    host.Dispose();
                }
            }
        }

Следующим шагом было написание входящей роли брандмауэра для получения доступа к порту.

Затем я протестировал ее на нашем Windows сервере. Стандарт 2016 года.

-> Тест пройден в Postman на другом компьютере!

Теперь, как вы уже видели (в коде), я перенес код в Windows Приложение службы (user = Local) System). Я вхожу в Windows Событие, и у меня нет ошибки при запуске хоста (поэтому я использовал try catch).

-> Не удалось выполнить тест с браузером на сервере, а также с Postman на другом machine.

Я понял, что должен зарезервировать путь с помощью netsh

Я попытался:

netsh http add urlacl url=http://+:8377/api/heartbeat user=everyone

netsh http add urlacl url=http://machineName.corp:8377/api/heartbeat/ user=everyone

Установил приложение Сервис с моим пользователем (admin) и настроил URL

netsh http add urlacl url=http://+:8377/api/heartbeat user=myUser

netsh http add urlacl url=http://machineName.corp:8377/api/heartbeat/ user=myUser

-> Проверка с помощью браузера на сервере не удалось, а также с почтальоном на другом компьютере.

На данный момент я не мог найти решение, почему мой API не работает.

У кого-нибудь есть идеи?

-edit-

Консольное приложение:

C: \ Windows \ system32> netstat -na | найти "8378" TCP 0.0.0.0:8378 0.0.0.0:0 СЛУШАТЬ TCP [::]: 8378 [::]: 0 СЛУШАТЬ TCP [fe80 :: 5505: 852 c: 952e: 74f% 6]: 8378 [fe80 :: 5505: 852 c: 952e: 74f% 6]: 62555 УСТАНОВЛЕННЫЙ TCP [fe80 :: 5505: 852 c: 952e: 74f% 6]: 62555 [fe80 :: 5505: 852 c : 952e: 74f% 6]: 8378 УСТАНОВЛЕНО

Windows Приложение службы:

C: \ Windows \ system32> netstat -na | найти "8377" нет ответа!

...